正题
ybtoj KMP-2
题目大意
问你一个字符串最多由多少个相同的字符串组合而成
解题思路
如下图,先用KMP求出nx数组,那么有1∼nxn1\sim nx_n1∼nxn和(n−nxn)∼n(n-nx_n)\sim n(n−nxn)∼n相匹配
不难推出1∼(n−nxn)1\sim (n-nx_n)1∼(n−nxn)和nxn∼nnx_n\sim nnxn∼n匹配,则nxn∼nnx_n\sim nnxn∼n为最小的相同的字符串
如果(n−nxn)∣n(n-nx_n)\mid n(n−nxn)∣n那么有解
代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define N 1000100
using namespace std;
int nx[N];
char str[N];
void gnx(char* s) {int n = strlen(s + 1);for (int i = 2, j = 0; i <= n; ++i) {while (s[i] != s[j + 1] && j) j = nx[j];if (s[i] == s[j + 1])j++;nx[i] = j;}return;
}
int main() {scanf("%s", str + 1);while (str[1] != '.') {gnx(str);int n = strlen(str + 1);nx[1] = 0;if (n % (n - nx[n]) == 0)//判断是否有解printf("%d\n", n / (n - nx[n]));elseputs("1");scanf("%s", str + 1);}return 0;
}