AC:100
#include<iostream>
#include<cstring>
using namespace std;
int next[100001];
string m,s;
void getnext(){
next[0]=-1;
for(int i=0,j=-1;i<=s.length();){
if(j==-1||s[i]==s[j])
next[++i]=++j;
else
j=next[j];
}
}
int main(){
cin>>m>>s;
getnext();
int l=0,r=0;
while(l<m.length()){
if(r==-1||m[l]==s[r])
l++,r++;
else
r=next[r];
if(r==s.length()){
cout<<l-s.length()+1<<"\n";
r=next[r];
}
}
for(int i=1;i<=s.length();i++){
cout<<next[i]<<" ";
}
}
样例都没过去
#include<iostream>
#include<cstring>
using namespace std;
int next[100001];
string m,s;
void getnext(){
next[0]=-1;
for(int i=0,j=-1;i<=s.length();){
if(j==-1||s[i]==s[j])
next[++i]=++j;
else
j=next[j];
}
}
int main(){
cin>>m>>s;
getnext();
int l=0,r=0;
while(l<m.length()){
if(r==-1||m[l]==s[r])
l++,r++;
else
r=next[r];
if(r>=s.length()){
cout<<l-s.length()+1<<"\n";
r=next[r];
}
}
for(int i=1;i<=s.length();i++){
cout<<next[i]<<" ";
}
}
两个代码的唯一不同就是主串与模式串匹配中
一个是
if(r==s.length())
结果AC
另一个
if(r>=s.length())
就玄学了=-=
本蒟蒻没有找到越界等状况
(可能是眼瞎)
求大佬解答