poj3461 Oulipo【KMP】

来源:互联网 发布:mac清理软件破解版 编辑:程序博客网 时间:2024/05/29 06:54

题目链接:

http://poj.org/problem?id=3461


题目大意:

给一个字符串T,表示文章,再给一个字符串W,表示单词。T和W都只包含26个大写英文字母。

现在计算单词W在文章T中出现的次数。W在T中出现的次数必须连续完全匹配,没两次匹配可能

有重叠的部分。


思路:

先求出字符串W的Next[]指针,然后进行匹配,当一次匹配成功后,继续回退到Next[j]向后进行

匹配,直到字符串T的末尾。此时,得到的匹配成功次数为所求,即W在T中出现的次数。


AC代码:

#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;const int MAXN = 1000010;char T[MAXN],W[MAXN];int Next[MAXN],len1,len2;void GetNext(){    int i = 0,j = -1;    Next[0] = -1;    while(i < len2)    {        if(j == -1 || W[i] == W[j])        {            i++;            j++;            Next[i] = j;        }        else            j = Next[j];    }}int KMP(){    len1 = strlen(T);    len2 = strlen(W);    GetNext();    int i = 0,j = 0;    int Ans = 0;    while(i < len1)    {        if(j == -1 || T[i] == W[j])            i++,j++;        else            j = Next[j];        if(j == len2)        {            Ans++;            j = Next[j];        }    }    return Ans;}int main(){    int N;    cin >> N;    while(N--)    {        cin >> W >> T;        int ans = KMP();        cout << ans << endl;    }    return 0;}


0 0
原创粉丝点击