题意:输入一个串,在它的所有前缀中,如果出现了周期串,输出周期串的长度和重复次数。
思路:KMP算法。这应该算是KMP算法next数组的一个应用。一个周期串,假设长度为len,周期长为p,那么它的前len-p个字符和后len-p个字符肯定是完全一样的。这样就可以利用next数组的性质求解。
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <string.h>
#include <ctype.h>
using namespace std;
char str[1000010];
int next[1000010];
int main(){
int n;
int cas=0;
while(cin>>n){
cas++;
if(!n)break;
memset(next,0,sizeof(next));
scanf("%s",str);
int j=-1;
next[0]=-1;
for(int i=1;i<n;i++){
if(str[i]==str[j+1]){
j++;
next[i]=j;
}else{
while(j!=-1&&str[next[j]+1]!=str[i]){
j=next[j];
}
if(str[i]==str[j+1]){
j++;
next[i]=j;
}else{
next[i]=-1;
}
}
}
printf("Test case #%d\n",cas);
for(int i=1;i<n;i++){
if(next[i]!=-1&&(i+1)%(i-next[i])==0){
printf("%d %d\n",i+1,(i+1)/(i-next[i]));
}
}
cout<<endl;
}
return 0;
}