Power Strings
格式难调,题面就不放了。
一句话题意,求给定的若干字符串的最短循环节循环次数。
就这样。
分析:
一道思路神奇的题目,需要深入理解$KMP$的$next$数组。
如果自己写几个字符串推一下就可以发现,一个由循环节构成的字符串,从第二个循环节开始$next$值是依次递增的,因为$next$数组的本质是表示$0 o i-1$的最长公共前缀后缀长度。也就不难想到,只要判断一下$next[n]$的值就行了。
Code:
//It is made by HolseLee on 11th Aug 2018 //UVA10298 #include<bits/stdc++.h> using namespace std; const int N=2e6+7; int n,nxt[N],k; char s[N]; int main() { while(scanf("%s",s)){ if(s[0]=='.')break; n=strlen(s); nxt[0]=nxt[1]=0;k=0; for(int i=1;i<n;++i){ while(k&&s[i]!=s[k]) k=nxt[k]; nxt[i+1]=(s[i]==s[k]?++k:0); } printf("%d ",((!nxt[n])||(nxt[n]&&n%(n-nxt[n]))?1:n/(n-nxt[n]))); } return 0; }