几道KMP的模板题
记录下KMP学习过程
注意:这里的模板s1是文本串s2是匹配串(模式串)
HDU1711 Number Sequence链接
最小匹配位置
#include<iostream>
#include<bits/stdc++.h>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
const ll maxn=1e6+5;
const ll MOD=1e9+7;
const ll INF=1e15+5;
int _next[maxn];
int s1[maxn],s2[maxn];
void build_next(int len){
int ptr=0,t=-1;
_next[0]=-1;
while(ptr<len){
if(t==-1||s2[ptr]==s2[t]){
ptr++;t++;
_next[ptr]=(s2[ptr]!=s2[t]?t:_next[t]);//优化版(这样写有-1)
//_next[ptr]=t;//无优化版
}
else t=_next[t];
}
}
int KMP(int len1,int len2){
build_next(len2);
int ptr1=0,ptr2=0;
int cnt=0;
while(ptr1<len1&&ptr2<len2){
if(ptr2==-1||s1[ptr1]==s2[ptr2]){
ptr1++;ptr2++;
}
else ptr2=_next[ptr2];
if(ptr2==len2)return ptr1-len2+1;
}
return -1;
}
int main