0
点赞
收藏
分享

微信扫一扫

poj3461 Oulipo【KMP】

小月亮06 2022-07-27 阅读 36


题目链接:

​​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 条评论