码迷,mamicode.com
首页 > 其他好文 > 详细

UVA10298 Power Strings [KMP]

时间:2018-08-11 11:38:36      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:size   names   target   can   next   tps   power   range   const   

  题目传送门

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]

标签:size   names   target   can   next   tps   power   range   const   

原文地址:https://www.cnblogs.com/cytus/p/9458887.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!