hdu 2594 Simpsons’ Hidden Talents

hdu 2594 点击打开链接


题意:给出两个字符串 s1 , s2,求出是s1的前缀 并且是s2的后缀的最长字符串。


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;
#define maxn  50009
char a[maxn],b[maxn];
int next[maxn];
void get_next(char *a)
{
    int i=0,j=-1;
    next[0] = -1;
    while(a[i]){
        if(j==-1 || a[i]==a[j] ){
            if(a[++i] != a[++j]) next[i] = j;
            else next[i] = next[j];
        }
        else j = next[j];
    }
}
int KMP(char *a,char *b)///拿a去匹配b
{
    int i=0,j=0;
    get_next(a);
    while( b[j] )///判断条件只是判断b,是因为我们要求a的前缀与b 的后缀最大重合部分,所以下面就可以直接return i;了。
    {
        if(i==-1||a[i] == b[j]) ++i,++j;
        else i = next[i];
    }
    return i;
}
int main()
{
    while(scanf("%s%s",a,b)!=EOF)
    {
        int k1=KMP(a,b);
       if(k1==0) printf("0\n");
       else {
              a[k1] = '\0';
              printf("%s %d\n",a,k1);
       }
    }
    return 0;
}


你可能感兴趣的:(hdu 2594 Simpsons’ Hidden Talents)