Hdu-1358Period(KMP算法之next数组的应用)

题解:对于串pattern来说,如果0~i-1这个位置中循环,那么i%(i-next[i])==0 ,循环次数为 i/(i-next[i]),循环长度为 i-next[i]

例如对于串ababab来说

index  0 1 2 3 4 5

char    a b a b a b

next   -1 0 0 1 2 1

对于index=4时,i%(i-next[i])==0,而0~3位置的字符存循环。

代码:

#include<cstdio>
#include<iostream>
#include<cstring>
int N,next[1000001];
char pattern[1000001];//用于存放模式串

void getNext()//求next数组的模板
{
    next[0]=-1;
    int k=-1,j=0;
    while(j<N){
        if(k==-1||pattern[k]==pattern[j]){
            ++j;++k;
            next[j]=k;
        }
        else
            k=next[k];
    }
}

void
solve() {
  //如果i%(i-next[i])==0 那么就有循环,循环次数为 i/(i-next[i]),循环长度为 i-next[i]
int i,n; for(i=2;pattern[i-1];++i){ n=i-next[i];//这里我借鉴了一位大牛的博客,感谢大牛的博客 if(i%n==0 && i/n>1){ printf("%d %d\n",i,i/n); } } return;//记得得回溯 }
int main() { int cnt=0; while(~scanf("%d",&N),N){ getchar(); memset(next,0,sizeof(next)); gets(pattern); getNext(); printf("Test case #%d\n",++cnt); solve(); printf("\n"); } return 0; }
//关于solve()函数的详细解析请参考大牛的博客,http://www.cnblogs.com/jackge/archive/2013/01/05/2846006.html

 

posted @ 2018-11-08 21:29  里昂静  阅读(127)  评论(0编辑  收藏  举报