您的位置:首页 > 其它

KMP poj 3461

2013-12-03 11:30 204 查看
找一个模式串在主串中出现的次数

#include <iostream>
#include <cstring>

using namespace std;

const int MAXN = 1000010;
const int MAXM = 10010;

int nextval[MAXM];

void Get_NextVal(char* str)
{
int len = strlen( str );
int i = 0, j = -1;
nextval[0] = -1;
while (i < len)
{
if (j == -1 || str[i] == str[j])
{
++i;
++j;
if(str[i] == str[j])
nextval[i] = nextval[j];
else
nextval[i] = j;
}
else
j = nextval[j];
}
}

int KMP(char* str1, char* str2)
{
int i = 0, j = 0;
int ans = 0;
int len1 = strlen(str1);
int len2 = strlen(str2);
Get_NextVal(str1);
while (i < len2)
{
if (j == -1 || str1[j] == str2[i])
{
++i;
++j;
}
else
j = nextval[j];
if(j >= len1)
{
ans++;
j = nextval[j];//这里不是从模式串的首部从新开始,而是从他的nextval开始
}
}
return ans;
}

int main()
{
int T;
cin>>T;
char str1[MAXM], str2[MAXN];
while (T--)
{
cin>>str1;
cin>>str2;
int sum = 0;
sum = KMP(str1, str2);
cout<<sum<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: