UVA10298 Power Strings [KMP]
Power Strings
格式难调,题面就不放了。
一句话题意,求给定的若干字符串的最短循环节循环次数。
就这样。
分析:
一道思路神奇的题目,需要深入理解$KMP$的$next$数组。
如果自己写几个字符串推一下就可以发现,一个由循环节构成的字符串,从第二个循环节开始$next$值是依次递增的,因为$next$数组的本质是表示$0\to 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; }
蒟蒻写博客不易,如果有误还请大佬们提出
如需转载,请署名作者并附上原文链接,蒟蒻非常感激
名称:HolseLee
博客地址:www.cnblogs.com/cytus
个人邮箱:1073133650@qq.com
如需转载,请署名作者并附上原文链接,蒟蒻非常感激
名称:HolseLee
博客地址:www.cnblogs.com/cytus
个人邮箱:1073133650@qq.com