hdu 1358 KMP运用

来源:互联网 发布:linux命令查看进程 编辑:程序博客网 时间:2024/04/28 04:57

题意:求前缀的循环周期。
示例:abababab
前4个字符,循环字串为ab,有2个循环周期 ab|ab
前6个字符,循环字串为ab,有3个循环周期 ab|ab|ab
前8个字符,循环字串为ab,有4个循环周期 ab|ab|ab|ab
输出:
4 2
6 3
8 4

当i=6时,next[4] = 4; 

循环字串的长度 =  next[i] - (2 * next[i] - i) = 2     //2*next[i]-i 为相交长度

循环字串的周期 = i / 循环字串的长度

 

#include <iostream>using namespace std;const int MAXN = 1000010;char str[MAXN];int next[MAXN];int main(){int n;int Case = 1;while(cin>>n,n){cin>>str;int j = -1;int i = 0;next[0] = -1;while(i < n){if(j == -1 || str[i] == str[j]){i++;j++;next[i] = j;}else{j = next[j];}}printf("Test case #%d\n",Case++);for(int i=1; i<=n; i++){int cross = 2*next[i] - i;  //相交部分的长度int circle = next[i] - cross;     //循环长度if(cross >= 0 && i % circle == 0)  {printf("%d %d\n",i,i/circle);}}printf("\n");}return 0;}


 

 

原创粉丝点击