题意
给出一个字符串,求字符串的最多能由多少相同的子串组成
思路
kmp的next数组求循环节
最小循环节长度=len-next[len],len是字符串长度,next数组下标从0开始,所以最多能由len/最小循环节长度。next[len]=0输出1。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int MAXN = 1000005;
int nxt[MAXN];
char a[MAXN];
void get_next() {
int i = 0, j = -1;
nxt[0] = -1;
int len = strlen(a);
while (i < len) {
if (j == -1 || a[i] == a[j]) {
i++, j++;
nxt[i] = j;
}
else {
j = nxt[j];
}
}
}
int main() {
while (scanf("%s", a) != EOF) {
if (a[0] == '.')break;
get_next();
int ans = 1;
int n = strlen(a);
if (n % (n - nxt[n]) == 0 && n / (n - nxt[n]) > 1) {
ans = n / (n - nxt[n]);
}
printf("%d\n", ans);
}
return 0;
}