您的位置:首页 > 其它

hdu 1686(标准的kmp,可当模板)

2011-02-19 18:58 190 查看
/*
题意:给两个字符串a,s,判断a在s里出现的个数

*/

#include <stdio.h>
#include <string.h>

int next[10005];
char a[10005];
char s[1000005];
int n,len_a,len_s;

void Get_Next()
{

a[0] = '#';//因为是a+1,如果a[0]不存在,那strlen(a) = 0 ;       !!!!!!!!!!!
len_a = strlen(a);
len_s = strlen(s);
next[1] = 0;
int j = 0;
for(int i=2;i<=len_a;i++)
{
while(j > 0 && a[j+1] != a[i])//  j+1要理解,j因为要连续向前找next[j],而不是j+1
j = next[j];
if(a[j+1] == a[i])
j++;
next[i] = j;
}
}

int Str_Match()
{//跟Get_Next类似,理解后可手写!
int j = 0;
int num = 0;
for(int i=0;i<len_s;i++)
{
while(j>0 && a[j+1]!=s[i])
j = next[j];
if(a[j+1] == s[i])
j++;
if(j == len_a - 1){
j=next[j];
num++;
}
}
return num;
}

int main()
{
scanf("%d",&n);
while(n--)
{
getchar();
scanf("%s %s",a+1,s);//!!!!这用的是a+1,为的是字符串位置跟实际位置相对应,函数好写一点
Get_Next();
printf("%d\n",Str_Match());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: