kmp字符串匹配:
#include<bits/stdc++.h>
using namespace std;
string t,p;
int next_bool[1000001];
int next_ycl(int mode)
{
next_bool[1]=0;
int i=1;
int j=0;
while(i<mode)
{
if(p[i]==p[j])
next_bool[++i]=++j;
else if(j==0)
next_bool[++i]=j;
else{
j=next_bool[j+1];
}
}
}
void kmp(int modet,int modep){
int i=0,j=0;
while(i<modet)
{
if(t[i]==p[j])
{
i++;
j++;
}
else if(j==0) i+=1;
else
{
if((i+modep-j)>=modet) return;
else j=next_bool[j+1];
}
if(j==modep){
cout<<i-j+1<<endl;
j=0;
i=i-modep+2;
}
}
}
int main(){
cin>>t>>p;
next_ycl(p.size());
kmp(t.size(),p.size());
for(int i=1;i<=p.size();i++)
cout<<next_bool[i]<<" ";
}
做出来不是re 就是 tle,但是我真不知道哪里内存爆了,就是最简单的数据也会爆。自己尝试用string 写出来的与题解都不一样,真的很痛苦