【ybtoj 高效进阶 2.3】【kmp】 重复子串
题目
解题思路
将每一个串和自己匹配
处理出next数组
可以得知 x x x[1… n e x t next next[ l e n len len]] 与 x x x[ l e n len len- n e x t next next[ l e n len len]… l e n len len] 是完全匹配的
如果总长度除以这个子串的长度没有余数
说明ta就是由重复连续子串组成的
代码
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
char x[1002000];
int len, next[1002000];
int main() {
scanf("%s", x + 1);
len = strlen(x + 1);
while (!(x[1] == '.' && len == 1)) {
//多组数据
int k = 0;
for (int i = 1; i < len; i++) {
while (k > 0 && x[i + 1] != x[k + 1]) k = next[k];
if (x[i + 1] == x[k + 1])
k++;
next[i + 1] = k;
} //自己匹配
if (len % (len - next[len]) == 0) //是否由重复连续子串组成
printf("%d\n", len / (len - next[len]));
else
printf("1\n");
memset(next, 0, sizeof(next)); //要清0哦
scanf("%s", x + 1);
len = strlen(x + 1);
}
return 0;
}