[模板]KMP字符串匹配

洛谷P3375

注意:两次过程大致相同,故要熟读熟记,切勿搞混

   可以看看其他的教程:http://www.cnblogs.com/c-cloud/p/3224788.html

   本来就不太熟,若是在记不住,就放弃

 #include<bits/stdc++.h>
using namespace std;
#define man 1000010
string p,t;
int next[man];
inline void makenext()
{ int q,k;
int m=p.size();
next[]=;
for(q=,k=;q<m;q++)
{ while(k>&&p[q]!=p[k])
k=next[k-];
if(p[q]==p[k])
k++;
next[q]=k;
}
}
inline void kmp()
{ int n,m;
n=t.size();
m=p.size();
makenext();
for(int i=,k=;i<n;i++)
{ while(k>&&p[k]!=t[i])
k=next[k-];
if(p[k]==t[i])
k++;
if(k==m)
cout<<(i-m++)<<endl;//从零开始计数时,整体数值加一(因为题目要求从一开始计数)
}
}
int main()
{ cin>>t>>p;
kmp();
for(int i=;i<p.size();i++)
cout<<next[i]<<" ";
cout<<endl;
return ;
}
上一篇:从汇编看c++中含有虚基类对象的析构


下一篇:缓存淘汰算法(LFU、LRU、ARC、FIFO、MRU)分析