UVA10298 Power Strings [KMP]

Posted cytus

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA10298 Power Strings [KMP]相关的知识,希望对你有一定的参考价值。

  题目传送门

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
",((!nxt[n])||(nxt[n]&&n%(n-nxt[n]))?1:n/(n-nxt[n])));
    }
    return 0;
}

 

以上是关于UVA10298 Power Strings [KMP]的主要内容,如果未能解决你的问题,请参考以下文章

UVA10298 Power Strings [KMP]

「UVA10298」 Power Strings(KMP

UVA - 10298 后缀数组(仅观赏)

题解 UVA11149 Power of Matrix

[POJ2406]Power Strings

poj 2406Power Strings 后缀数组DC3模板 连续重复子串