POJ_2406_Power Strings

/*

题意:求循环节最长长度

nt[]数组的分布:

abcd 

-1 0 0 0 0 

aaaa

-1 0 1 2 3

abab

-1 0 0 1 2

注意-1后再也没有出现过-1啦



*/

#include<iostream>

#include<cstring>

#include<string>

#include<cmath>

#include<cstdio>

#include<algorithm>

#include<vector>

using namespace std;

#define M 1000005

int lena,lenb,Max;

int nt[M];

char b[M];

void getnt(char *b)

{

    int j=0,k=-1;

    nt[0]=-1;

    while(j<lenb)

    {

        if(k==-1||b[j]==b[k])   //此举旨在找寻B串中重复的东东

        {

            k++,j++;

            //如果下一个b[j]不等于b[k],那下一次nt[j]要回到k的位置,这是高速回位的方法

            nt[j]=k;

        }

        else k=nt[k];

    }

    /*for(int i=0; i<=lenb; ++i)

        printf("%d ",nt[i]);

    puts("");*/



}

int main()

{

    while(~scanf("%s",b)&&b[0]!='.')

    {

        lenb=strlen(b);

        getnt(b);

        int ok=lenb-nt[lenb]; 

        if(nt[lenb]%ok==0) //如果是循环节 nt[lenb]最后一定会等比较大,然后%ok肯定会等于0

        {

            printf("%d\n",lenb/ok);

        }

        else puts("1");

    }

}

 

你可能感兴趣的:(String)