HDU 1358

View Code
 1 /*
 2 前缀子串能否有某个周期串重复k次,输出子串长度和最大的k,也就是最小周期情况下的k。
 3 也就是说求前缀子串的最大循环节 
 4 方法: 遍历前缀子串,若周期存在则输出,关键在于如何求最小周期 
 5 */
 6 #include <iostream>
 7 #include <cstdlib>
 8 #include <cstring>
 9 #include <string>
10 using namespace std;
11 int next[1000010];
12 string s;
13 void get()
14 {
15     int i=0,j=-1,k;
16     memset(next,0,sizeof(next));
17     next[0] = -1;
18     while(i<s.length())
19     {
20         if(j==-1||s[i]==s[j])
21         {
22             i++;
23             j++;
24             next[i] = j;
25         }
26         else
27             j = next[j];
28     }
29 }
30 int main()
31 {
32     int i,j,k,t;
33     int T;
34     int flag = 1;
35     while(cin>>T,T)
36     {
37         int f = 1;
38         s.clear();
39         cin>>s;  
40         get();
41         cout<<"Test case #"<<flag<<endl;
42         for(i=2;i<=s.length();i++)
43         {
44             int temp = i - next[i];
45             if(i%temp==0&&i!=temp)//若不加上 i!=temp,第二组会多输出3 1 
46             {
47                 int ans = i/temp;
48                 cout<<i<<" "<<ans<<endl;          
49             }
50         }
51         flag ++;
52         cout<<endl;
53     }
54     return 0;
55 }
56       
57 
58 超时      
 1 /*
 2 前缀子串能否有某个周期串重复k次,输出子串长度和最大的k,也就是最小周期情况下的k。
 3 也就是说求前缀子串的最大循环节 
 4 方法: 遍历前缀子串,若周期存在则输出,关键在于如何求最小周期 
 5 */
 6 #include <string.h>
 7 #include <stdio.h>
 8 int next[1000010];
 9 char s[1000010];
10 int T;
11 void get()
12 {
13     int i=0,j=-1,k;
14     memset(next,0,sizeof(next));
15     next[0] = -1;
16     while(i<T)
17     {
18         if(j==-1||s[i]==s[j])
19         {
20             i++;
21             j++;
22             next[i] = j;
23         }
24         else
25             j = next[j];
26     }
27 }
28 int main()
29 {
30     int i,j,k,t;
31     int flag = 1;
32     while(scanf("%d%*c",&T),T)
33     {
34         int f = 1,temp,ans;
35         memset(s,0,sizeof(s));
36         if(flag>1)
37             printf("\n");
38         scanf("%s",s);
39         get();
40         printf("Test case #%d\n",flag);
41         for(i=2;i<=T;i++)
42         {
43             temp = i - next[i];
44             if(i%temp==0&&i!=temp)//若不加上 i!=temp,第二组会多输出3 1 
45             {
46                 ans = i/temp;
47                 printf("%d %d\n",i,ans);       
48             }
49         }
50         flag ++;
51     }
52     return 0;
53 }
54             

 

posted @ 2012-08-21 15:49  加拿大小哥哥  阅读(536)  评论(0编辑  收藏  举报