HDU-1358 Period (KMP循环问题)
题意:给你一个长度为n的串,输出其存在循环节的子串长度,以及循环节个数
思路:昨天在 HDU-3746 Cyclic Nacklace 上有详细讲到求循环节的原理 ,然后总结一下结论
令 k = len % (len-next[len]) len为字符串的长度
(1)如果next[len] == 0则说明没有循环节
(2)如果len % k 则说明有循环节 同时循环节个数为 num = len / k ;
完整代码:
#include <iostream> #include <cstdio> #include <cstring> const int maxn = 1e6+5; int nex[maxn] ; int len; char s[maxn]; void getnext(){ int i,j; i = 0,j=-1; nex[i] =j; while(i<len){ if(j==-1||s[i]==s[j]){ nex[++i] = ++j; }else j = nex[j]; } } void getcircle(){ for(int i=1;i<=len;i++){//i即代表当前子字符串长度 int ans,num; if(nex[i]!=0) { ans = i%(i - nex[i]); num = i/(i - nex[i]); if(!ans) printf("%d %d\n",i,num); } } } int main(){ int T,cnt; cnt = 0; while(~scanf("%d",&T)&&T){ scanf("%s",&s); len = T; getnext(); printf("Test case #%d\n",++cnt); getcircle(); printf("\n"); } }