博大精深的KMP,我要开始搞你了!
首先,了解KMP算法,KMP是一种改进了的字符串算法,用于优化匹配字符串的。
至于具体内容,本人还是讲不出来的,见几种好的讲解。KMP KMP理解 KMP算法
具体问题,HDU1711:
模板代码如下:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N = 1000005; int s[N],p[N],Next[N];//此处有“巨坑”,next是在iostream中已定义的,不能用,用的话去掉iostream头文件 void Getfail(int m)//next不能用 { Next[0]=-1; int i=0,j=-1; while(i<m) { if(j==-1||p[i]==p[j])//匹配 { i++,j++; Next[i]=j; } else j=Next[j]; } } int KMP(int n,int m) { int i=0,j=0; while(i<n) { if(j==-1||s[i]==p[j]) i++,j++; else j=Next[j]; if(j==m) return i-j+1; } return -1; } int main() { int t,n,m; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%d",&s[i]); for(int i=0;i<m;i++) scanf("%d",&p[i]); Getfail(m); printf("%d\n",KMP(n,m)); } return 0; }
hihocoder1015
HDU1686(代码相同)
POJ3461
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N = 1000005; char s[N],p[N]; int Next[N];//此处有“巨坑”,next是在iostream中已定义的,不能用,用的话去掉iostream头文件 void Getfail(int m) { Next[0]=-1; int i=0,j=-1; while(i<m) { if(j==-1||p[i]==p[j])//匹配 { i++,j++; Next[i]=j; } else j=Next[j]; } } int KMP(int n,int m) { int i=0,j=0,ans=0; while(i<n) { if(j==-1) { i++,j++; } if(s[i]==p[j]) { if(j==m-1) { ans++; j=Next[j]; } else { i++,j++; } } else j=Next[j]; } return ans; } int main() { int t,n,m; scanf("%d",&t); while(t--) { scanf("%s%s",p,s); m=strlen(p);//要用来匹配的字符串 n=strlen(s);//主字符串 Getfail(m); printf("%d\n",KMP(n,m)); } return 0; }