1. 程式人生 > >UVA10298 Power Strings [KMP]

UVA10298 Power Strings [KMP]

次數 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]