前缀树板子

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 @   Marinaco  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示