首页 > 其他 > 详细

poj3461 Oulipo【KMP】

时间:2015-04-21 11:11:02      阅读:237      评论:0      收藏:0      [点我收藏+]

题目链接:

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;
}


poj3461 Oulipo【KMP】

原文:http://blog.csdn.net/lianai911/article/details/45167281

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!