POJ2406 Power Strings

题目

KMP算法的熟练运用
由于KMP预处理是对模式串本身进行KMP
所以串尾、pre[size]部分完全一致,且pre[size]和pre[pre[size]]部分一致……
所以就代表一个循环节
若(size-pre[size])刚好能被size整除,则为循环节

#include <cstdio>
#include <iostream>
#include <string>
#define MAXN 1000005
using namespace std;

string str;
int pre[MAXN];

int main() {

    while(cin >> str) {
        if(str==".") break;
        int size = str.length();

        str = ' ' + str;
        pre[1] = 0; int len = 0;
        for(int i=1;i<size;++i) {
            while(len&&str[i+1]!=str[len+1]) len = pre[len];
            if(str[i+1]==str[len+1]) len++;
            pre[i+1] = len;
        }

        if(pre[size]!=0&&size%(size-pre[size])==0) printf("%d\n",size/(size-pre[size]));
        else puts("1");
    }

    return 0;
}
posted @ 2021-08-20 20:26  Neworld1111  阅读(14)  评论(0编辑  收藏  举报