题目来源: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;
}