当前位置:编程学习 > C/C++ >>

poj 1961 Period (KMP+最小循环节)

题目大意:   给定字符串,找出他所有的前缀的最小循环节的长度
解题思路:   思路与2406一样
                  Tlen%(Tlen-next[Tlen])==0则Tlen-next[Tlen]是最小循环节
                  证明过程参考2406的解题报告
                  这里需要多次查询处理
代码:
 
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#define MAX 1000010  
int next[MAX],Tlen;  
char ch[MAX];  
  
void Get_next()  
{  
    int i=0,j=-1;  
    next[0]=-1;  
    while(i<Tlen)  
    {  
        if(j==-1||ch[i]==ch[j])  
        {  
            i++; j++;  
            next[i]=j;  
        }  
        else  
            j=next[j];  
    }  
}  
  
int main()  
{  
    int n,i=1,j;  
    while(scanf("%d",&Tlen)!=EOF&&Tlen)  
    {  
        memset(next,0,sizeof(next));  
        scanf("%s",ch);  
        Get_next();  
        printf("Test case #%d\n",i++);  
        for(j=1;j<Tlen;j++)  
        {  
            n=j+1-next[j+1];  
            if((j+1)%n==0&&(j+1)!=n)    //***  
                printf("%d %d\n",j+1,(j+1)/n);  //***  
        }  
        puts("");  
    }  
    return 0;  
}  

 

 
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,