MLE/RE 玄关
查看原帖
MLE/RE 玄关
742071
ShuAkn楼主2024/7/17 19:03

本题#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;
}
2024/7/17 19:03
加载中...