链接:https://vjudge.net/problem/POJ-2406#author=chen_zhe_
题意:
给定若干个长度 ≤ 1000000 的字符串,询问每个字符串最多是由多少个相同的子字符串重复连接而成的。如:ababab
则最多有 3 个 ab
连接而成。
思路:
求kmp的next数组,next[len]对应的后缀长度可以被原长整除,则分为整除段,否则为1。
代码:
#include <iostream> #include <algorithm> #include <cstring> using namespace std; const int MAXN = 1e6 + 10; int Next1[MAXN]; int Next2[MAXN]; void Get_Next1(char *s) { int i = 0, k = -1, len = strlen(s); Next1[i] = k; while (i < len) { if (k == -1 || s[i] == s[k]) { i++; k++; Next1[i] = k; } else k = Next1[k]; } } int main() { char s[MAXN]; while (~scanf("%s", s)) { if (s[0] == '.') break; Get_Next1(s); int len = strlen(s); int res = 1; if (len % (len - Next1[len]) == 0) res = len / (len - Next1[len]); cout << res << endl; } return 0; }