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;
}
改写写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;
}
相关文章推荐
- poj 3461 Oulipo(KMP)
- poj 3461 kmp
- poj-3461 Oulipo KMP
- KMP POJ 3461 Oulipo
- POJ 3461 Oulipo kmp 水过
- Oulipo_poj_3461_KMP水题
- poj_3461 Oulipo(KMP:找出所有模式串)
- poj 3461 kmp
- HDU 1686 Oulipo / POJ 3461 Oulipo / SCU 2652 Oulipo (字符串匹配,KMP)
- POJ:3461-Oulipo(KMP模板题)
- poj3461——Oulipo(kmp)
- POJ 3461 Oulipo(简单KMP)
- POJ 3461 kmp
- POJ 3461 && HDU 1686 Oulipo(kmp)
- [KMP求模式在主串出现次数]POJ 3461 Oulipo
- poj 3461 Oulipo(KMP)
- POJ 3461 Oulipo (KMP字符串匹配·统计p在s中出现次数)
- HDOJ 1686 POJ 3461 Oulipo kmp
- 【POJ 3461】 Oulipo(KMP)
- Poj 3461 Oulipo(Kmp)