HDU 1358

http://acm.hdu.edu.cn/showproblem.php?pid=1358

求某个前缀的周期,用Next求循环节的题目

#include <iostream>

#include <cstdio>

#include <cstring>

#include <algorithm>

using namespace std ;

char B[1000005] ;

int Next[1000005],lenB ;

void GetNext()

{

    int i,j ;

    Next[1]=j=0 ;

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

    {

        while(j>0 && (B[j+1]!=B[i]))j=Next[j] ;

        if(B[j+1]==B[i])j++ ;

        Next[i]=j ;

    }

}

int main()

{

    int cas=1 ;

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

    { 

        scanf("%s",B+1) ;

        GetNext() ;

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

        for(int i=2 ;i<=lenB ;i++)

        {

            if(i%(i-Next[i])==0 && Next[i])

                printf("%d %d\n",i,i/(i-Next[i])) ;

        }

        putchar('\n') ;

    }

    return 0 ;

}
View Code

 

你可能感兴趣的:(HDU)