HDU 2594 Simpsons’ Hidden Talents (KMP的F数组应用)

来源:互联网 发布:什么软件图片好看 编辑:程序博客网 时间:2024/05/22 02:56

KMP中f数组意义:对于模式串的前i个字母构成的子串,这个子串会有一些前缀和后缀完全相同(包括长度),f[i]表示的就是这个最大的长度,而长度确定了前缀后缀就确定了。

对于这个题,如果将s1,s2连接成一个串c,c的长度为lc,那么f[lc]就是题目中要求的最大长度。


注意如果f[lc]大于la或lb,那么要修改成la和lb中的最小值lmin,至于为什么一定存在长度为lmin的相同前后缀,这个自己画一下图就知道了,思想就是对于后缀中的一部分对应着前缀中的一部分,而这部分在后缀中又对应前缀中的一部分,这样传递下去。


代码:

#include <iostream>#include <cstdio>#include <cstring>using namespace std;char a[50005];char b[50005];char c[100005];int f[100005];int main(){    while(~scanf("%s%s",a,b)){        int la=strlen(a);        int lb=strlen(b);        strcpy(c,a);        strcat(c,b);        int lc=strlen(c);        f[0]=f[1]=0;        for(int i=1;i<lc;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 res=f[lc];        res=min(res,la);        res=min(res,lb);        if(res){            for(int i=0;i<res;i++){                printf("%c",c[i]);            }            printf(" %d\n",res);        }        else printf("%d\n",res);    }    return 0;}


0 0
原创粉丝点击