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             

 

你可能感兴趣的:(HDU)