Time Limit: 3000MS | Memory Limit: 30000KB | 64bit IO Format: %I64d & %I64u |
Description
Input
Output
Sample Input
3 aaa 12 aabaabaabaab 0
Sample Output
Test case #1 2 2 3 3 Test case #2 2 2 6 2 9 3 12 4
__________________________________________________________________________________________
题目大意:求字符串的前缀中循环节的出现次数(大于1的)。
原理同上题一样,只是要注意next[]==-1时的判断。
__________________________________________________________________________________________
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 5 using namespace std; 6 const int maxl=1e6+10; 7 int t,l,cas=0; 8 char s[maxl]; 9 int next[maxl]; 10 void getnext() 11 { 12 next[0]=-1; 13 for(int j,i=1;i<l;i++) 14 { 15 j=next[i-1]; 16 while(s[i]!=s[j+1] && j>=0)j=next[j]; 17 next[i]=s[i]==s[j+1]?j+1:-1; 18 } 19 } 20 int main() 21 { 22 while(scanf("%d",&l)==1 && l!=0) 23 { 24 printf("Test case #%d\n",++cas); 25 scanf("%s",s); 26 getnext(); 27 for(int i=1;i<l;i++) 28 { 29 if(next[i]!=-1 && (i+1)%(i-next[i])==0)printf("%d %d\n",i+1,(i+1)/(i-next[i])); 30 } 31 printf("\n"); 32 } 33 return 0; 34 }
原文:http://www.cnblogs.com/gryzy/p/6537101.html