HDU 1358 Period KMP

题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1358


求周期问题,简单KMP——


AC代码:

 

#include <iostream>

#include <cstdio>

#include <cstdlib>

#include <cmath>

#include <cstring>

#include <string>

#include <vector>

#include <list>

#include <deque>

#include <queue>

#include <iterator>

#include <stack>

#include <map>

#include <set>

#include <algorithm>

#include <cctype>

using namespace std;



typedef long long LL;

const int N=1000005;

const LL II=100000000;

const int INF=0x3f3f3f3f;

const double PI=acos(-1.0);



int next[N],len,nextval[N];

char str[N];



void getnext(char *p)

{

    int j=0,k=-1;

    next[0]=-1;

    while(j<len)

    {

        if(k==-1||p[j]==p[k])

        {

            j++;    k++;

            next[j]=k;

        }

        else

            k=next[k];

    }

}



void getnextval(const char *p)

{

	int i = 0,j =-1;

	nextval[0]=-1;

	while(i!=len)

	{

		if(j==-1||p[i]==p[j])

		{

			++i;++j;

			if(p[i]!=p[j])

				nextval[i]=j;

			else

				nextval[i]=nextval[j];

		}

		else

			j=nextval[j];

	}

}



int main()

{

    int i,j,T,ca=0;

    while(scanf("%d",&len)&&len)

    {

        scanf("%s",str);

        getnext(str);

        printf("Test case #%d\n",++ca);

        for(i=2;i<=len;i++)

        {

            int t=i-next[i];

            if(i%t==0&&i/t!=1)

                printf("%d %d\n",i,i/t);

        }

        printf("\n");

    }

    return 0;

}


 

 

你可能感兴趣的:(HDU)