您的位置:首页 > 其它

[省选前题目整理][POJ 3461]Oulipo(KMP)

2015-04-08 08:49 489 查看

题目链接

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

题目大意

给出模式串W和主串T,求W在T中的出现次数。

思路

最基础的KMP。

代码

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>

#define MAXN 1001000
#define MAXM 10010

using namespace std;

char word[MAXM],text[MAXN];
int next[MAXM];

void getnext(char str[],int len)
{
int k=0;
next[1]=0;
for(int i=2;i<=len;i++)
{
while(k>0&&str[k+1]!=str[i]) k=next[k];
if(str[k+1]==str[i]) k++;
next[i]=k;
}
}

int match(char W[],int lenW,char T[],int lenT)
{
int ans=0;
getnext(W,lenW);
int k=0; //W已经匹配的长度
for(int i=1;i<=lenT;i++)
{
while(k>0&&W[k+1]!=T[i]) k=next[k];
if(W[k+1]==T[i]) k++;
if(k==lenW)
{
ans++;
k=next[k];
}
}
return ans;
}

int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(next,0,sizeof(next));
scanf("%s",word+1);
scanf("%s",text+1);
printf("%d\n",match(word,strlen(word+1),text,strlen(text+1)));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: