您的位置:首页 > 其它

POJ 3461 KMP

2012-04-19 15:12 337 查看
题意:输入两个字符串,在第二个字符串中含有多少个子串与第一个字符串相同。

改写写KMP算法

#include <iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int ans;

char sa[10010],sb[1000001];
int fail[10010];
int kmp(char* str, char* pat)
{
int i, j, k;
memset(fail, -1, sizeof(fail));
for (i = 1; pat[i]; ++i)
{
for (k=fail[i-1]; k>=0 && pat[i]!=pat[k+1];
k=fail[k]);
if (pat[k + 1] == pat[i]) fail[i] = k + 1;
}
i = j = 0;
while( str[i] ) // By Fandywang
{
if( pat[j] == str[i] ) ++i, ++j;
else if(j == 0)++i;//第一个字符匹配失败,从str下个字符开始
else j = fail[j-1]+1;

if(!pat[j])
{
ans++;
j=fail[j-1]+1;
}
}
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
scanf("%s%s",sa,sb);
ans=0;
kmp(sb,sa);

cout<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: