HUD 1358 Period

来源:互联网 发布:邓亚萍20个亿 知乎 编辑:程序博客网 时间:2024/06/05 19:55

 

1358考查:kmp算法中next数组的理解,求出next数组后.关键点:1.j=i-next[i],i%j==0则说明存在.       2.i/j,就是重复次数j=i-next[i]就是看i和next[i]之间有多少个字母,如果i%j==0,则说明i之前有一个周期性的长度为i-j的子串。
例子: str  a b a b a b a bnext -1 0 0 1 2 3 4 5 i    0 1 2 3 4 5 6 7
#include<iostream>using namespace std;char str[1000000 + 10];int next[1000000 + 10];void getNext(char str[],int len) {           int i=0,j=-1; next[0]=-1;    while(i<len)     {         if((j==-1)||(str[i]==str[j]))         {             j++;             i++;             next[i]=j;         }         else j=next[j];     } }void kmp(){for(int i = 2; str[i-1]; i++){int j = i - next[i];if(i%j==0 && i/j>1) printf("%d %d\n", i, i/j);}}int main(){    int m;int T = 1;while(scanf("%d", &m), m){    scanf("%s",str);printf("Test case #%d\n", T++);getNext(str, m);kmp();printf("\n");}return 0;}


 

原创粉丝点击