维护一个单词库,有以下三种指令:
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;
}