Evanyou Blog 彩带

  题目传送门

Power Strings

格式难调,题面就不放了。

一句话题意,求给定的若干字符串的最短循环节循环次数。

输入样例#1: 
abcd
aaaa
ababab
.
输出样例#1: 
1
4
3

就这样。


  分析:

  一道思路神奇的题目,需要深入理解$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;
}
原文地址:https://www.cnblogs.com/cytus/p/9458887.html