| Time Limit: 3000MS | Memory Limit: 30000K | |
| Total Submissions: 19817 | Accepted: 9640 | 
Description
Input
Output
Sample Input
3 aaa 12 aabaabaabaab 0
Sample Output
Test case #1 2 2 3 3 Test case #2 2 2 6 2 9 3 12 4
引用大佬的博客:简单的对next数组的应用,http://www.cnblogs.com/jackge/archive/2013/01/05/2846006.html
以及KMP算法的详细解释:https://blog.csdn.net/v_july_v/article/details/7041827
看了大佬的博客们写的代码:
#include<stdio.h>
int next[1000005];
int get_next(int n,char str[]){
	int i=0,j=-1;
	next[0]=-1;
	//当循环到没有正确匹配的str时都令j=next[j]
	//即上一次匹配到的最近 正确的 j 的下一个
	//KMP算法,这样可以减少消耗 
	while(i<n){
		if(j==-1||str[i]==str[j]){
			i++;
			j++;
			next[i]=j;
		}else{
			j=next[j];
		}
	}
}
int main(){
	int i,length,k=1;
	int temp;
	char str[1000005];
	int count=1;
	while(scanf("%d",&length)&&length){
		scanf("%s",str);
		get_next(length,str);
		printf("Test case #%d\n",count);
		count++;
		for(i=1;i<=length;i++){
			temp=i-next[i];
			//temp为最短循环节的长度
			if(i%temp==0&&i/temp>1)
				printf("%d %d\n",i,i/temp);
			//i%temp==0 是因为最小循环节需要被字符串长度整除
			//同时 需要被整除 
		}
		printf("\n");
	}
	return 0; 
}
原文:https://www.cnblogs.com/Cl0ud/p/11872072.html