HDU 1358

简介: View Code 1 /* 2 前缀子串能否有某个周期串重复k次,输出子串长度和最大的k,也就是最小周期情况下的k。 3 也就是说求前缀子串的最大循环节 4 方法: 遍历前缀子串,若周期存在则输出,关键在于如何求最小周期 5 */ 6 #include 7...
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             

 

目录
相关文章
|
Java 文件存储
hdu1128 Self Numbers
hdu1128 Self Numbers
37 0
|
人工智能 Java
2021杭电多校5-Arrary-hdu7020
Array Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) Total Submission(s): 965 Accepted Submission(s): 312 Problem Description Given an integer array a[1…n].
180 0
2021杭电多校5-Arrary-hdu7020
|
Java 人工智能
|
Java BI
HDU 1412 {A} + {B}
{A} + {B} Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 19833    Accepted Submission(s): 8245 Problem Description 给你两个集合,要求{A} + {B}.
841 0