struct TrieNode {
int pass =0, end =0;
unordered_map<int, TrieNode*> nexts;};
TrieNode* root =newTrieNode();// 增加单词voidAddWord(string word){
int index =0;
TrieNode* p = root;
p->pass++;for(char ch : word){
index = ch -'a';if(p->nexts[index]==nullptr){
p->nexts[index]=newTrieNode();}
p = p->nexts[index];
p->pass++;}
p->end++;}// 删除单词voidDeleteWord(string word){
if(SearchWord(word)==0)return;
TrieNode* p = root;
p->pass--;int index =0;for(char ch : word){
index = ch -'a';--p->nexts[index]->pass;
p = p->nexts[index];}
p = root;for(char ch : word){
index = ch -'a';// 删除了p->nexts[index],但是p->nexts[index]if(p->nexts[index]->pass ==0)delete p->nexts[index];
p = p->nexts[index];}}// 查询单词完整出现的次数intSearchWord(string word){
int index =0;
TrieNode* p = root;for(char ch : word){
index = ch -'a';if(p->nexts[index]==nullptr){
return0;}
p = p->nexts[index];}return p->end;}// 返回以字符串word作为前缀的单词数量intPrefixNumber(string word){
TrieNode* p = root;int index =0, num =0;for(char ch : word){
index = ch -'a';// 此时没有 没比完word之前,没出现直接returnif(p->nexts[index]==nullptr){
return0;}
p = p->nexts[index];}return p->pass;}