period.java

来自「PKU中一些数据结构基本算法题的java实现」· Java 代码 · 共 61 行

JAVA
61
字号
package PKU.KMP;

import java.util.Scanner;


/**
 * ID:1961
 * KMP
 * @author yhm
 *
 */
public class Period {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		int i=0;
		while(true){
			int size = cin.nextInt();
			if(size==0) break;			
			i++;
			String str = cin.next();
			System.out.println("Test case #"+i);
			solve(str);
		}
	}
		
		static void solve(String str){
			if(str.length()==0) return;
			int[] next = computeNext(str);
			int size = str.length();
			for(int i=2;i<=size;i++){
				int right = i-next[i];
				if(i%right==0){
					if(i/right==1) continue;
					System.out.print(i);
					System.out.println(" "+i/right);
				}
			}
			System.out.println();
		}
		
		static int[] computeNext(String str){
			int size = str.length();
			int[] next= new int[size+1];
			next[0] = -1;
			next[1] = 0;
			for(int i=2;i<=size;i++){
				int j = next[i-1]+1;
				while(j>0&&(str.charAt(i-1)!=str.charAt(j-1))){
					j=next[j-1]+1;
				}
				next[i]=j;
			}
			return next;
		}

}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?