POJ 2406 Power Strings KMP算法之next数组的应用

题意:给一个字符串,求该串最多由多少个相同的子串相接而成。

思路:只要做过poj 1961之后,这道题就很简单了。poj 1961 详细题解传送门

假设字符串的长度为len,如果 len % (len - next[len])不为0,说明该字符串不能由其他更短的字符串反复相接而成,结果输出1,否则答案为len / (len - next[len])。

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define maxn 1000010
 4 char s[maxn];
 5 int next[maxn];
 6 void get_next(char str[])
 7 {
 8     next[0] = -1;
 9     int i = 0;
10     int j = -1;
11     int len = strlen(str);
12     while (i < len)
13     {
14         if (j == -1 || str[i] == str[j])
15         {
16             i++; j++;
17             next[i] = j;
18         }
19         else j = next[j];
20     }
21 }
22 int main()
23 {
24     while (scanf("%s", s))
25     {
26         int len = strlen(s);
27         if (len == 1 && s[0] == '.') break;
28         get_next(s);
29         printf("%d\n", len % (len - next[len]) ? 1 : len / (len - next[len]));
30     }
31     return 0;
32 }

 

posted @ 2013-08-07 11:41  fenshen371  阅读(179)  评论(0编辑  收藏  举报