首页 > 代码库 > HDU 1358 (所有前缀中的周期串) Period

HDU 1358 (所有前缀中的周期串) Period

题意:

给出一个字符串,在所有长度大于1的前缀中,求所有的周期至少为2的周期串,并输出一个周期的长度以及周期的次数。

分析:

有了上一题 HDU 3746 的铺垫,这道题就很容易解决了

把next求出来,然后逐个判断即可。

 1 #include <cstdio> 2 #include <cstring> 3  4 const int maxn = 1000000 + 10; 5 char p[maxn]; 6 int n, next[maxn]; 7  8 void get_next() 9 {10     int k = -1, j = 0;11     next[0] = -1;12     while(j < n)13     {14         if(k == -1 || p[k] == p[j])15         {16             k++;17             j++;18             next[j] = k;19         }20         else k = next[k];21     }22 }23 24 int main(void)25 {26     //freopen("1358in.txt", "r", stdin);27     int kase = 0;28     while(scanf("%d", &n) == 1 && n)29     {30         memset(next, 0, sizeof(next));31         scanf("%s", p);32         getchar();33         get_next();34         35         printf("Test case #%d\n", ++kase);36         for(int i = 2; i <= n; ++i)37         {38             if(next[i] == 0) continue;39             int cir = i - next[i];40             if(i % cir == 0)41                 printf("%d %d\n", i, i / cir);42         }43         puts("");44     }45 46     return 0;47 }
代码君

 

HDU 1358 (所有前缀中的周期串) Period