

思路:对于每一个串进行KMP找最长前后缀相同长度
所以n-p[n]就是最短字串
code
#include<bits/stdc++.h>
using namespace std;
char c[1000100];
int p[1000100];
void work(){
int len=strlen(c);
for(int i=1,j=0;i<len;i++){
while(j>0&&c[i]!=c[j]) j=p[j];
if(c[i]==c[j]) j++;
p[i+1]=j;
}
}
int main(){
scanf("%s",c);
while(c[0]!='.'){
memset(p,0,sizeof(p));
work();
int n=strlen(c);
if(n%(n-p[n])==0) printf("%d\n",n/(n-p[n]));
else printf("1\n");
cin>>c;
}
}
该博客主要介绍了如何使用KMP算法解决字符串中最短重复子串的问题。代码实现中,首先计算字符串的最长公共前后缀,然后判断字符串长度是否能被这个长度整除,从而找到最短重复部分。如果可以整除,则最短重复子串的长度为字符串长度除以最长公共前后缀长度;否则,最短重复子串长度为1。

被折叠的 条评论
为什么被折叠?



