码迷,mamicode.com
首页 > 其他好文 > 详细

poj3461 Oulipo【KMP】

时间:2015-04-21 11:12:27      阅读:138      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!