HDU 2594 Simpsons’ Hidden Talents(KMP)

来源:互联网 发布:财务战略矩阵eva 编辑:程序博客网 时间:2024/06/06 01:03

解题思路:

求相同的前缀和后缀。开一个数组保存到i位置,模式串有多少个字符和文本串匹配即可。

#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <algorithm>#include <cmath>#include <vector>#include <queue>#include <stack>#define LL long long#define FOR(i,x,y) for(int i=x;i<=y;i++)using namespace std;const int maxn = 100000 + 10;char s[maxn], t[maxn];int c[maxn];int next[maxn];void get_next(){    int m = strlen(s);    next[0] = 0; next[1] = 0;    for(int i=1;i<m;i++)    {        int j = next[i];        while(j && s[i] != s[j]) j = next[j];        next[i+1] = (s[i] == s[j]) ? j + 1 : 0;    }}int KMP(){    int n = strlen(t), m = strlen(s);    get_next();    int j = 0;    for(int i=0;i<n;i++)    {        while(j && s[j] != t[i]) j = next[j];        if(s[j] == t[i]) j++;        c[i] = j;    }}int main(){    while(scanf("%s", s)!=EOF)    {        scanf("%s", t);        KMP();        int n = strlen(t);        if(c[n-1] == 0) printf("0\n");        else        {            for(int i=0;i<c[n-1];i++)                printf("%c", s[i]);            printf(" %d\n", c[n-1]);        }    }    return 0;}

0 0