hdu 2594 Simpsons’ Hidden Talents KMP

来源:互联网 发布:utorrent for linux 编辑:程序博客网 时间:2024/05/22 02:11

题意:

给定两个字符串a和b,找出a最长的前缀,使得该前缀正好是b的后缀。

题解:

标准的KMP算法,我们只要用a匹配b,匹配到末尾的时候,其匹配值就是答案了。





代码:

#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <iostream>#include <algorithm>#include <queue>#include <map>#include <vector>using namespace std;const int maxn=5e4+10;char a[maxn],b[maxn];int f[maxn];void getFail(char *a,int *f,int n){    int i,j;    f[0]=f[1]=0;    for(i=1;i<n;i++)    {        j=f[i];        while(j&&a[i]!=a[j])j=f[j];        f[i+1]=a[i]==a[j]?j+1:0;    }}int find(char *a,char *b,int *f){    int i,j=0,n,m;    n=strlen(a);    m=strlen(b);    getFail(b,f,m);    for(i=0;i<n;i++)    {        while(j&&a[i]!=b[j])j=f[j];        if(a[i]==b[j])j++;    }    return j;}int main(){    while(scanf("%s%s",a,b)!=EOF)    {        int i,j,k;        k=find(b,a,f);        if(k==0)printf("0\n");        else        {            for(i=0;i<k;i++)printf("%c",a[i]);            printf(" %d\n",k);        }    }    return 0;}


0 0
原创粉丝点击