KMP求出f数组后,最小覆盖子串为长度为len-f[len]的前缀。证明在前面的文章里。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char c[100005];
int T;
int f[100005];
int main(){
scanf("%d",&T);
while(T--){
scanf("%s",c);
f[0]=f[1]=0;
int len=strlen(c);
for(int i=1;i<len;i++){
int j=f[i];
while(j&&c[i]!=c[j]) j=f[j];
f[i+1]=(c[i]==c[j]?j+1:0);
}
int cir=len-f[len];
int res=0;
if(cir==len) res=len;
else {
if(len%cir==0) res=0;
else res=cir-len%cir;
}
printf("%d\n",res);
}
return 0;
}
本文深入探讨了KMP算法的实现细节,并提供了一个具体的代码示例来展示如何使用KMP算法找出字符串中的最小覆盖子串。通过计算失配表(f数组),可以有效地解决这一问题。

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



