POJ2406 Power Strings

思路

kmp求最小循环节的题目,next数组是一个前缀的前缀和后缀相同的最长长度,所以n向前跳最小的长度就是最小的循环节,答案就是n-next[n],注意不可整除时输出1

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int nxt[1000100];
char s[1000100];
int find(char *s,int len){
    nxt[0]=0;
    nxt[1]=0;
    for(int i=1;i<len;i++){
        int j=nxt[i];
        while(j&&s[i]!=s[j])
            j=nxt[j];
        if(s[i]==s[j])
            nxt[i+1]=j+1;
        else
            nxt[i+1]=0;
    }
    return (len%(len-nxt[len]))?1:len/(len-nxt[len]);
}
int main(){
    while(scanf("%s",s)){
        if(s[0]=='.')
            break;
        printf("%d\n",find(s,strlen(s)));
    }
}
posted @ 2019-03-05 15:29  dreagonm  阅读(88)  评论(0编辑  收藏  举报