您的位置:首页 > 其它

Nyoj 5 Binary String Matching

2014-04-08 14:03 253 查看
题目来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=5

修正的nextval写法:

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int MAXN = 1010;
const int MAXM = 11;

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 ans)
{
int Len1 = strlen(str1);
int Len2 = strlen(str2);
int i = 0, j = 0;
Get_NextVal(str1);
while(i < Len2)
{
if(j == -1 || str2[i] == str1[j])
++i, ++j;
else
j = nextval[j];
if(j >= Len1)
{
ans++;
j = nextval[j];
}
}
return ans;
}

int main()
{
char str1[MAXM], str2[MAXN];
int T;
scanf("%d", &T);
while(T--)
{
scanf("%s", str1);
scanf("%s", str2);
printf("%d\n", KMP(str1, str2, 0));
}
return 0;
}


非修正:

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

const int MAXN = 1010;
const int MAXM = 11;

int next[MAXM];

void Get_Next(char* str)
{
int Len = strlen(str);
int i = 0, j = -1;
next[0] = -1;
while(i < Len)
{
if(j == -1 || str[i] == str[j])
{
++i, ++j;
next[i] = j;//表示下一个与i向匹配的位置
}
else
j = next[j];
}
}

int KMP(char* str1, char* str2, int ans)
{
int Len1, Len2;
Len1 = strlen(str1);
Len2 = strlen(str2);
int i = 0, j = 0;
Get_Next(str1);
while(i < Len2)
{
if(j == -1 || str2[i] == str1[j])
++i, ++j;
else
j = next[j];

if(j >= Len1)
{
ans++;
j = next[j];
}
}
return ans;
}

int main()
{
int T;
char str1[MAXM], str2[MAXN];
scanf("%d", &T);
while(T--)
{
scanf("%s", str1);
scanf("%s", str2);
printf("%d\n", KMP(str1, str2, 0));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: