HDU-1686(KMP)

来源:互联网 发布:婚礼相册mv制作软件 编辑:程序博客网 时间:2024/05/05 08:31

这道题目,主要是一定要利用上匹配的字符串.

以前都是搜到了就结束了,这次不行,搜到了,咱们用一下next[j](当j==M时)

我崩溃的是自己next[j]+1了...wa了一次 还有.没有加i++的时候一直TLE 因为aaaa aaaa无法处理,,,嘿嘿

所以大家仔细看看吧  我把重点的标出来

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <math.h>char str[1000100];char pat[10005];int N,M;int next[10005];void Next(){memset(next,0,sizeof(next));int temp;next[0]=0;for(int i=1;i<M;i++){temp=next[i-1];while(temp&&pat[temp]!=pat[i])temp=next[temp-1];if(pat[temp]==pat[i])next[i]=temp+1;elsenext[i]=0;}}int KMP(){int sum=0;int j=0;int i=0;while(i<N){if(str[i]==pat[j]){if(j==M-1){sum++;j=next[j];//不能加1i++;//注意i++要不然就TLE了}elsei++,j++;}else if(j==0)i++;else j=next[j-1];}return sum;}int main(){int T;scanf("%d",&T);getchar();while(T--){scanf("%s%s",pat,str);N=strlen(str);M=strlen(pat);Next();printf("%d\n",KMP());}return 0;}


 

原创粉丝点击