警示后人(关于MLE与TLE)
查看原帖
警示后人(关于MLE与TLE)
580608
lupengheyyds楼主2023/7/22 17:01

不要递归的添加边!!!

不要递归的添加边!!!

不要递归的添加边!!!

这是递归建边的代码:

void Add(int x,string s,int pos){
	if(pos==s.size()){
		mark[x]=true;
		return;
	}	
	if(trie[x][s[pos]-'a']==0)trie[x][s[pos]-'a']=++cnt;
	Add(trie[x][s[pos]-'a'],s,pos+1);
	return;
}

这样MLE\color{Blue}MLE了,后来我发现不能穿string(他会复制)

于是变成了这样

void Add(int x,string &s,int pos){
	if(pos==s.size()){
		mark[x]=true;
		return;
	}	
	if(trie[x][s[pos]-'a']==0)trie[x][s[pos]-'a']=++cnt;
	Add(trie[x][s[pos]-'a'],s,pos+1);
	return;
}

这样TLE\color{Blue}TLE了,但是如果用循环实现

void Add(string s){
	int u=root;
	for(int i=0;i<s.size();i++){
		int d=s[i]-'a';
		if(trie[u][d]==0)trie[u][d]=++cnt;
		u=trie[u][d];
	}
	mark[u]=true;
	return;
}

就AC\color{Green}AC了

2023/7/22 17:01
加载中...