题意:
给出一个串,这个串是由R个子串重复得到,求最大的这个R。
题解:
算法集合之《后缀数组》国家对论文是说用后缀数组可以处理复杂度是O(n),但是感觉大材小用了,这题用kmp完全可以解决。
#include<iostream> #include<math.h> #include<stdio.h> #include<algorithm> #include<string.h> #include<vector> #include<queue> #include<map> #include<set> using namespace std; #define B(x) (1<<(x)) typedef long long ll; const int oo=0x3f3f3f3f; const ll OO=1LL<<61; const int MOD=10007; const int maxn=1000005; char str[maxn]; int next[maxn]; void get_next(char T[],int len) { int i=0; next[i]=-1; int j=-1; while(i<len){ if(j==-1||T[i]==T[j]){ i++;j++; next[i]=j; }else{ j=next[j]; } } } int main(){ while(scanf("%s",str)!=EOF){ if(str[0]=='.')break; int len=strlen(str); get_next(str,len); int ans= len%(len-next[len])==0 ? len/(len-next[len]) : 1; printf("%d\n",ans); } return 0; } /** */