HDU 2594 Simpsons’ HiddenTalents(KMP:后缀与前缀)

来源:互联网 发布:手机淘宝怎么退货退款 编辑:程序博客网 时间:2024/05/18 20:11

HDU 2594 Simpsons’ HiddenTalents(KMP:后缀与前缀)

http://acm.hdu.edu.cn/showproblem.php?pid=2594

题意:

        给定两个串S1和S2,你要找到S1的最长前缀,且这个前缀还要是S2的后缀.

分析:

        本题只需要利用KMP计算串S2的后缀能匹配S1的前缀是多长即可。即S2作为目标串,S1作为模板串。然后用S1去匹配S2,看看S2中i位置能匹配S1串最长前缀的长度ex[i]。

AC代码:

#include <iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>using namespace std;const int MAXN=50000+1000;char T[MAXN],P[MAXN];int f[MAXN],ex[MAXN];int n,m;void getFail(){    f[0]=f[1]=0;    for(int i=1;i<m;i++)    {        int j=f[i];        while(j && P[i]!=P[j]) j=f[j];        f[i+1] = (P[i]==P[j])?j+1:0;    }}void find(){    int j=0;    for(int i=0;i<n;i++)    {        while(j && T[i]!=P[j]) j=f[j];        if(T[i]==P[j])j++;        ex[i]=j;    }}int main(){    while(scanf("%s %s",P,T)==2)    {        n=strlen(T);        m=strlen(P);        getFail();        find();        if(ex[n-1]==0)            printf("0\n");        else        {            for(int i=0;i<ex[n-1];i++)                printf("%c",P[i]);            printf(" %d\n",ex[n-1]);        }    }    return 0;}


0 0
原创粉丝点击