前缀树板子

build方法(注意将节点编号cnt初始化为1)

int cnt;
const int maxn=1e6+5;
int trie[maxn][26];
int pass[maxn];
int last[maxn];
void build(){
	cnt=1;
}

insert方法(向字典树中插入一个单词)

void insert(string word){
	int cur=1;
	pass[cur]++;
	for(int i=0,path;i<word.size();i++){
		path=word[i]-'a';
		if(trie[cur][path]==0){
			trie[cur][path]=++cnt;
		}
		cur=trie[cur][path];
		pass[cur]++;
	}
	last[cur]++;
}

search方法(查询单词出现频率)

int search(string word){
	int cur=1;
	for(int i=0,path;i<word.size();i++){
		path=word[i]-'a';
		if(trie[cur][path]==0){
			return 0;
		}
		cur=trie[cur][path];
	}
	return last[cur];
}

prefix方法(查询以pre作前缀的单词数量)

int prefix(string pre){
	int cur=1;
	for(int i=0,path;i<pre.size();i++){
		path=pre[i]-'a';
		if(trie[cur][path]==0){
			return 0;
		}
		cur=trie[cur][path];
	}
	return pass[cur];
}

erase方法(在trie中删除单词word)

void erase(string word){
	if(search(word)>0){
		int cur=1;
		for(int i=0,path;i<word.size();i++){
		path=word[i]-'a';
		if(--pass[trie[cur][path]]==0){
			trie[cur][path]=0;
			return;
		}
		cur=trie[cur][path];		
		}
		last[cur]--;
	}
}
posted @ 2025-01-26 23:46  Marinaco  阅读(15)  评论(0)    收藏  举报
//雪花飘落效果