题意:给一个字符串,求该串最多由多少个相同的子串相接而成。
思路:只要做过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 ", len % (len - next[len]) ? 1 : len / (len - next[len])); 30 } 31 return 0; 32 }