HDU 1358(kmp)

来源:互联网 发布:mac重启黑屏 编辑:程序博客网 时间:2024/06/05 09:12

题意:给出一个数字n,接下来一行是一个字符串,n是这个字符串的长度。求这个字符串的所有是循环字符串的前缀。

kmp中的next数组只得是第i个字符匹配错误,向前跳的位置next【i】。

 

#include<algorithm>#include<stdio.h>#include<string>#include<string.h>#include<math.h>#include<queue>#include<iostream>using namespace std;int i,j,k;int len;char s[1000001];int next[1000001];void get_next()  {      int i=0,j=-1;      next[0]=-1;      for(;s[i];)          if(j==-1||s[i]==s[j])          {              ++i;++j;              next[i]=j;          }          else j=next[j];  }   int main(){int t=1;    while(scanf("%d",&len)&&len){        getchar();        scanf("%s",s);        get_next();        printf("Test case #%d\n",t++);        for(i=2;i<=len;i++){             j=i-next[i];             if(i%j==0){                 if(i/j>1) printf("%d %d\n",i,i/j);            }        }        printf("\n");    }    return 0;}


 

0 0
原创粉丝点击