求助Trie板子
查看原帖
求助Trie板子
703085
Myosotis_alpestris楼主2023/7/24 10:18

维护一个单词库,有以下三种指令:

1 s:s为要增加的字符串

2 s:s为要删除的字符串(删除一次)

3 s:查询s在词库里出现的次数(在词库里存在s或以s为前缀的词)

板子都做不出来狠狠破防了

#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int MAXN=1e6+10;
int num,ans;
struct trietree{
	int cnt=0;
	int child[26]={0};
}trie[MAXN];
int tcnt=0;
void insert(string &s)
{
	int rootid=0;
	for (char c:s){
		int cid=c-'a';
		if(trie[rootid].child[cid]==0)	trie[rootid].child[cid]=++tcnt;
		rootid=trie[rootid].child[cid];
		trie[rootid].cnt++;
		//cout<<c<<" "<<trie[rootid].cnt<<endl;
	}
	//trie[rootid].cnt++;
}
void del(string &s)
{
	int rootid=0;
	for (char c:s){
		int cid=c-'a';
		if(trie[rootid].child[cid]==0){
			trie[rootid].child[cid]=++tcnt;
		}
		rootid=trie[rootid].child[cid];
		if(trie[rootid].cnt>0) trie[rootid].cnt--;
	}
}
int find(string &s)
{
	int rootid=0;
	for (char c:s){
		int cid=c-'a';
		if(trie[rootid].child[cid]==0){
			return 0;
		}
		rootid=trie[rootid].child[cid];
	}
	return trie[rootid].cnt;
}
signed main()
{
	string s;
	int n;
	cin>>n;
	int opt;
	for (int i=1;i<=n;i++){
		cin>>opt>>s;
		if(opt==1)	insert(s);
		else if(opt==2) del(s);
		else cout<<find(s)<<endl;
	}
	return 0;
}
2023/7/24 10:18
加载中...