UVA10298 Power Strings
Solution:
题意就是求每个串的最小循环节的循环次数。
裸的kmp,直接对串求一下next值,考虑到最长公共前后缀的性质,画画图不难发现,当原串拥有循环节时,必定满足条件$next[n]\neq 0$且$(n-next[n])|n$,此时最小循环节长度显然就是$n-next[n]$,循环次数就是$\frac{n}{n-next[n]}$。
代码:
#include<bits/stdc++.h> #define il inline #define ll long long #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++) #define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--) using namespace std; const int N=1e7+2; int f[N]; char s[N]; int main(){ while(scanf("%s",s)==1){ if(s[0]=='.')exit(0); int n=strlen(s),p=0; For(i,1,n-1){ while(p&&s[i]!=s[p])p=f[p]; if(s[i]==s[p])f[i+1]=(++p); else f[i+1]=0; } printf("%d\n",(!f[n]||f[n]&&n%(n-f[n])?1:n/(n-f[n]))); } return 0; }
PS:~蒟蒻写博客不易,转载请注明出处,万分感谢!~