HDU1358--KMP找周期(KMP基本题型到此总结完毕)

来源:互联网 发布:网络上赌博怎么处罚 编辑:程序博客网 时间:2024/06/05 17:20

/**********************
* author:crazy_石头
* Pro:HDOJ 1358-Period
* algorithm: KMP
* Judge Status:Accepted
* Memory:5120K
* Time:78ms
* date:2013/11/01
***********************/

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>

using namespace std;

#define rep(i,h,n) for(int i=(h);i<=(n);i++)

const int maxn=1000000+5;
int next[maxn];
char p[maxn];
int n,test;//主串的串长;

inline void getNext(char *p,int *next)
{
    int i,j;
    i=0,j=-1;
    next[0]=-1;
    int m=strlen(p);
    while(i<m)
    {
        if(j==-1||p[i]==p[j])
            i++,j++,next[i]=j;
        else
            j=next[j];
    }
}

int main()
{
    test=1;
    while(scanf("%d",&n)!=EOF&&n)
    {
        scanf("%s",p);
        printf("Test case #%d\n",test++);
        getNext(p,next);

        rep(i,2,n)
        {
            if(i%(i-next[i])==0&&next[i]>0)
            printf("%d %d\n",i,i/(i-next[i]));
        }
        printf("\n");
    }
    return 0;
}

* This source code was highlighted byYcdoiT. ( style: Pyte )

注意求next值得时候模式串的串长应该先算出来用一个变量m(或者其他的变量)承接一下,以后用这个变量,不然会T。。。。T_T

原创粉丝点击