poj1961(kmp算法next数组应用)

Posted frankchen831x

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj1961(kmp算法next数组应用)相关的知识,希望对你有一定的参考价值。

题目链接:https://vjudge.net/problem/POJ-1961

题意:给定一个长为n的字符串(n<=1e6),对于下标i(2<=i<=n),如果子串s(1...i)是周期子串,输出其最大周期。

思路:

  考察对kmp算法中next数组的定义掌握,如果(i+1)%(i-j)==0 && (i+1)/(i-j) > 1,那么该子串即为满足条件。

AC代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;

const int maxn=1e6+5;
int n,cas,nex[maxn];
char s[maxn];

void get_next(){
    int j;
    j=nex[0]=-1;
    for(int i=1;i<n;++i){
        while(j>-1&&s[i]!=s[j+1]) j=nex[j];
        if(s[i]==s[j+1]) ++j;
        nex[i]=j;
        if((i+1)%(i-j)==0&&(i+1)/(i-j)>1)
            printf("%d %d
",i+1,(i+1)/(i-j));
    }
}

int main(){
    while(scanf("%d",&n),n){
        scanf("%s",s);
        printf("Test case #%d
",++cas);
        get_next();
        printf("
");
    }
    return 0;
}

 

以上是关于poj1961(kmp算法next数组应用)的主要内容,如果未能解决你的问题,请参考以下文章

poj 1961Period(字符串--KMP循环节)

《算法竞赛进阶指南》0x15 POJ1961 KMPNext数组求循环节

poj2185(kmp算法next数组求最小循环节,思维)

Poj 1961 KMP

POJ--2406Power Strings+KMP求字符串最小周期

POJ2406 Power Strings POJ1961 Period