这份板子用的是数字匹配的时候,如果要字符的把int改成char。kmp返回值由题目确定。
建议写kmp的时候输入的下标从0开始,不然可能会出问题
int p[maxn+10];//模式 int s[maxn+10];//文本 int n,w; void build(int s[],int n)//构造nxt数组相当于把匹配串错开一位自己进行比较 { int k=0;nxt[0]=0; for(int i=1;i<n;i++) { while(k&&s[i]!=s[k])//注意是while循环,因为可能回退一次之后依旧不相等 k=nxt[k-1]; if(s[i]==s[k]) k++; nxt[i]=k; } } int kmp(int w[],int s[],int lw,int ls) { int ans=0; build(s,ls); int j=0; for(int i=0;i<lw;i++) { while(j&&w[i]!=s[j])//不相等就回退 j=nxt[j-1]; if(w[i]==s[j])//相等就++ j++; if(j==ls) { ans++;j=nxt[j-1];//匹配串已经匹配完了bingo } } return ans; }
