len-f[len]为最小覆盖子串长度。
如果能整除len答案就是商,否则答案是1。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char s[1000005];
int f[1000005];
void getfail(){
int len=strlen(s);
f[0]=f[1]=0;
for(int i=1;i<len;i++){
int j=f[i];
while(j&&s[i]!=s[j]) j=f[j];
f[i+1]=(s[i]==s[j]? j+1: 0);
}
}
int main(){
while(1){
scanf("%s",s);
if(strcmp(s,".")==0) break;
getfail();
int cir=len-f[len];
if(len%cir==0){
printf("%d",len/cir);
}
else printf("1");
printf("\n");
}
return 0;
}
本文介绍了如何通过算法计算字符串中最小覆盖子串长度,并提供了实现代码。
&spm=1001.2101.3001.5002&articleId=46927771&d=1&t=3&u=08842fd9b0f74620b4df90228fc7fb38)
587

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



