关于kmp模板
那个求p串的next数组 这个版本是下标从1开始的字符串,如果从0开始的话,可以在前面加空字符,然后p.size或者s.size的地方-1即可。
nex[1]=0
for(int i=2,j=0;i<=p.size();i++)
{
while(j&&p[i]!=p[j+1])j=nex[j];
if(p[i]==p[j+1])j++;
nex[i]=j;
}
kmp函数
for(int i=1,j=0;i<=s.size();i++)
{
while(j&&s[i]!=p[j+1])j=nex[j];
if(s[i]==p[j+1])j++;
if(j==p.size())
{
那么此时在s串中模式串p的起始下标就是i-p.size()+1.
返回即可。
}
}
据此修改的下标为0开始的代码
- #include<iostream>
- using namespace std;
- string s,p;
- int next1[100];
- void nex(){
- next1[0]=-1; //
- for(int i=1,j=-1;i<p.size();i++){ //
- while (j!=-1&&p[i]!=p[j+1]) //
- {
- j=next1[j];
- }
- if(p[i]==p[j+1])j++;
- next1[i]=j;
- }
- }
- int main(void){
- cin>>s>>p;
- nex();
- for(int i=1,j=-1;i<s.size();i++){ //
- while (j!=-1&&s[i]!=p[j+1])
- {
- j=next1[j];
- }
- if(s[i]==p[j+1])j++;
- if(j==p.size()-1){
- cout<<i-p.size()+1; //
- break;
- }
- }
- return 0;
- }