UVA10298 Power Strings [KMP]
阿新 • • 發佈:2018-08-11
次數 mic for region span orange main $0 pre
題目傳送門
Power Strings
格式難調,題面就不放了。
一句話題意,求給定的若幹字符串的最短循環節循環次數。
輸入樣例#1:abcd
aaaa
ababab
.
輸出樣例#1: 1
4
3
就這樣。
分析:
一道思路神奇的題目,需要深入理解$KMP$的$next$數組。
如果自己寫幾個字符串推一下就可以發現,一個由循環節構成的字符串,從第二個循環節開始$next$值是依次遞增的,因為$next$數組的本質是表示$0\~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\n",((!nxt[n])||(nxt[n]&&n%(n-nxt[n]))?1:n/(n-nxt[n]))); } return 0; }
UVA10298 Power Strings [KMP]