HDU 3746 Cyclic Nacklace(KMP最小覆盖子串)

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)