(2012-07-14 02:44:44)
SOJ2652:http://cstest.scu.edu.cn/soj/problem.action?id=2652
过的第一道KMP题。
SOJ2652:http://cstest.scu.edu.cn/soj/problem.action?id=2652
过的第一道KMP题。
这道题主要是解决输出所有子串的个数而不是像KMP算法里的仅仅输出第一个子串的位置。
代码:
#include<iostream>
#include<cstring>
using namespace std;
int next[10005];
char text[1000005];
char pattern[10005];
int main()
{
int test;
scanf("%d",&test);
while(test--)
{
scanf("%s%s",pattern,text);
strcat(pattern,"0");
int lP=strlen(pattern);
int j=0;
int k=-1;
next[0]=-1;
while(pattern[j])
{
if(k==-1 || pattern[j]==pattern[k])
{
++j;
++k;
if(pattern[j]!=pattern[k])
next[j]=k;
else
next[j]=next[k];
}
else
k=next[k];
}
j=0;
int i=0;
int result=0;
while(text[i])
{
if(text[i]==pattern[j])
{
i++;
j++;
}
else if(next[j]==-1)
{
j=0;
i++;
}
else
j=next[j];
if(j==lP-1)
{
result++;
j=next[j];
}
}
printf("%d\n",result);
}
return 0;
}