Period(POJ 1961)

Posted qseer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Period(POJ 1961)相关的知识,希望对你有一定的参考价值。

测评传送门

题意:

一个字符串,求所有循环节长度及位置

Sample Input

3
aaa
12
aabaabaabaab
0

Sample Output

Test case #1
2 2
3 3

Test case #2
2 2
6 2
9 3
12 4

通过样例1再解释下题意:

aa可由第1个a循环 2 次得到,输出位置:2,循环长度:2

aaa可由第1个a循环 3 次得到,输出位置:3,长度:3

做法:KMP的 next 预处理

code

#include<stdio.h> 
#include<string.h> 
using namespace std;
const int mxn=1e6+10;
int n,cnt,next[mxn];
char str[mxn];

void Sol() {
    int j=0;
    for(int i=2;i<=n;++i) {
        while(j>0 && str[i]!=str[j+1]) j=next[j]; 
        if(str[i]==str[j+1]) ++j;
        next[i]=j;
    }
}

int main() 
{
    while(scanf("%d",&n) && n) 
    {
        scanf("%s",str+1);
        Sol();
        printf("Test case #%d
",++cnt);
        for(int i=2;i<=n;++i) {
            int len=i-next[i];
            if(i!=len && i%len==0) {
                printf("%d %d
",i,i/len);
            }
        }
        puts("");
    }
    return 0;
}
/*
12
aabaabaabaab
3
aaa
0
*/

 

以上是关于Period(POJ 1961)的主要内容,如果未能解决你的问题,请参考以下文章

POJ——T 1961 Period

POJ-1961 Period

poj 1961 period

POJ1961 Period

poj 1961 Period

POJ2406 Power Strings POJ1961 Period