您的位置:首页 > 其它

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

2015-07-17 10:38 435 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: