本题#12,#14两个点不是MLE就是RE
所以前来求助
玄一关。
MLE版
#include<bits/stdc++.h>
using namespace std;
vector<int> next1,ans;
string s,k;
void nextLoad(string k){
int prefixLen=0;
next1.push_back(0);
for(int i=1;i<k.size();i++){
if(k[i]==k[prefixLen]){
prefixLen++;
next1.push_back(prefixLen);
}
else if(prefixLen==0){
prefixLen=0;
next1.push_back(prefixLen);
}
else{
prefixLen=next1[prefixLen-1];
i--;
}
}
}
void kmp(string s, string k) {
int n=0,i=0;
nextLoad(k);
while(i<s.size()){
if (s[i]==k[n]){
if(n==k.size()-1){
ans.push_back(i-n);
n=next1[n];
}
else{
n++;
i++;
}
}
else{
if(n>0){
n=next1[n - 1];
}
else{
i++;
}
}
}
}
signed main(){
cin>>s>>k;
kmp(s,k);
for(int i=0;i<ans.size();i++){
cout<<ans[i]+1<<endl;
}
for(int i=0;i<next1.size();i++){
cout<<next1[i]<<" ";
}
cout<<endl;
return 0;
}
RE版
#include<bits/stdc++.h>
using namespace std;
vector<int> next1;
int ans[100000];
string s,k;
int v;
void nextLoad(string k){
int prefixLen=0;
next1.push_back(0);
for(int i=1;i<k.size();i++){
if(k[i]==k[prefixLen]){
prefixLen++;
next1.push_back(prefixLen);
}
else if(prefixLen==0){
prefixLen=0;
next1.push_back(prefixLen);
}
else{
prefixLen=next1[prefixLen-1];
i--;
}
}
}
void kmp(string s, string k) {
int n=0,i=0;
nextLoad(k);
while(i<s.size()){
if (s[i]==k[n]){
if(n==k.size()-1){
ans[v]=i-n;
v++;
n=next1[n];
}
else{
n++;
i++;
}
}
else{
if(n>0){
n=next1[n - 1];
}
else{
i++;
}
}
}
}
signed main(){
cin>>s>>k;
kmp(s,k);
for(int i=0;i<v;i++){
cout<<ans[i]+1<<endl;
}
for(int i=0;i<k.size();i++){
cout<<next1[i]<<" ";
}
cout<<endl;
return 0;
}