好久没写过KMP了,都忘了怎么写了,重写一下温习一遍。
int next[maxn];
string a;
void getNext()
{
int j=0,k=-1,len=a.size();
next[0]=-1;
while(j<len)
{
if(k==-1||a[j]==a[k])
{
j++,k++;
next[j]=k;
}
else k=next[k];
}
}
另附查找函数
int find(string Pat,string T)
{
int posP=0,posT=0;
int lenP=Pat.size();
int lenT=T.size();
while(posP<lenP&&posT<lenT)
{
if(posP==-1||Pat[posP]==T[posT])
{
posP++;posT++;
}
else posP=next[posP];
}
}
void getnext()
{
int i=0,j=-1;
next[0]=-1;
while(i<m)
{
if(j==-1 || pat[i]==pat[j])
{
i++;j++;
if(p at[i]!=pat[j])
next[i]=j;
else next[i]=next[j];
}else j=next[j];
}
}
int KMP()
{
getnext();
int i=0,j=0;
while(i<n && j<m)
{
if(j==-1 || s[i]==pat[j])
{
i++;j++;
}else j=next[j];
}
if(j==m)return i-m+1;
else return -1;
}