hdu 2594 Simpsons’ Hidden Talents 【KMP】

来源:互联网 发布:linux数据库备份软件 编辑:程序博客网 时间:2024/06/05 07:20

题目链接:http://acm.acmcoder.com/showproblem.php?pid=2594

题意:求最长的串 同时是s1的前缀又是s2的后缀。输出子串和长度。

思路:kmp

代码:

#include <vector>#include <string>#include <algorithm>#include <iostream>#include <stdio.h>#include <string.h>using namespace std;char s1[500010],s2[500010];char ANS[500010];void get_next(char x[], int m, int Next[]){    int i, j;    j = Next[0] = -1;    i = 0;    while (i < m)    {        while (-1 != j && x[i] != x[j]) j = Next[j];        Next[++i] = ++j;    }}int Next[1001000];int KMP(char x[], int m, char y[], int n)//x模式串 y主串{    int i, j;    i = j = 0;    get_next(x, m, Next);    if (n > m) i = n - m;    while (i < n)    {         if (j == -1 || y[i] == x[j])        {            i++;            j++;        }        else j = Next[j];    }    return j;}int main(){    while (cin>>s1>>s2)    {        int len1 = strlen(s1);        int len2 = strlen(s2);        int ans =  KMP(s1, len1, s2, len2);        if (ans !=0 )        {            for(int i=0;i<ans;i++) cout<<s1[i];cout<<" ";        }        cout<<ans<<endl;    }    return 0;}
0 0