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 }

 

你可能感兴趣的:(String)