题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358
题意:大概就是说给你一个字符串,然后找出能够循环的子串,输出子串某位置以及循环节的个数。
题解:用KMP算法得到next数组。然后,从i=2开始遍历,得到的i-next[i]为循环节大小。
如果对于i能够整除循环节,并且next数组的值不为0(如果为0,则代表不循环,但却可以整除)
则代表这个位置是可行的,位置为i,循环节个数为i/(i-next[i])
代码如下:
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<string> 6 using namespace std; 7 const int maxn=1000005; 8 int Next[maxn]; 9 char s[maxn]; 10 void getNext(int len) 11 { 12 int i=0,j=-1; 13 Next[0]=-1; 14 while(i<len) 15 { 16 if(j==-1||s[i]==s[j]) 17 { 18 i++; 19 j++; 20 Next[i]=j; 21 } 22 else 23 j=Next[j]; 24 } 25 } 26 int main() 27 { 28 int t; 29 int temp=1; 30 while(~scanf("%d",&t)) 31 { 32 if(t==0) break; 33 printf("Test case #%d\n",temp++); 34 scanf("%s",s); 35 int l=t; 36 getNext(l); 37 int k=l-Next[l]; 38 for(int i=2;i<=l;i++) 39 { 40 k=i-Next[i]; 41 if(!(i%k)&&Next[i]) 42 printf("%d %d\n",i,i/k); 43 } 44 printf("\n"); 45 } 46 }
时间: 2024-11-09 06:02:48