【题解】Power Strings POJ - 2406 ⭐⭐ 【KMP 循环节问题】

Power Strings POJ - 2406

假设s可以由t重复k次拼成,即s=tttt……tt,我们称为s=t^k。 先给定一个字符串s,求最大的n使得存在t满足s=t^n。

Input

多组数据,每行一个字符串(仅包含可打印字符且长度不超过1000000),以单独一行.作为终结标志

Output

每组数据一行答案

Examples

abcd
aaaa
ababab
.

Hint

1
4
3




题意:

This problem has huge input, use scanf instead of cin to avoid time limit exceed.

题解:

对于循环节问题, 要想到循环节的长度len为 M - next[M], 这里next为KMP中的next
如果len = 0 或 len不能被M整除, 则答案为1
否则为 M / len

经验小结:


#include
#include
#include
#include
using namespace std;
#define ms(x, n) memset(x,n,sizeof(x));
typedef  long long LL;
const int inf = 1 << 30;
const int maxn = 1e6+10;

char T[maxn];
int nxt[maxn], M;
void getNext(){
    ms(nxt, 0);
    int i = 0, j = -1;
    nxt[0] = -1;
    while(i < M){
        if(j == -1 || T[i] == T[j])
            nxt[++i] = ++j;
        else j = nxt[j];
    }
}
int main() {
    while(scanf("%s",T) && T[0]!='.'){
        M = strlen(T);
        getNext();
        int len = M-nxt[M];  //循环节t的长度

        if(nxt[M] == 0 || M%len != 0)
            cout << 1 << endl;
        else
            cout << M/len << endl;
    }
    return 0;
}
/* abcd aaaa ababab abcabc abcab . */

你可能感兴趣的:(数据结构)