struct TrieNode { int cnt; bool end; TrieNode* next[26] = {nullptr}; TrieNode() { cnt = 1; end = false; for (int i = 0; i < 26; i++) next[i] = nullptr; } }; class Solution { public: /** * * @param operators string字符串vector<vector<>> the ops * @return string字符串vector */ TrieNode* phead = new TrieNode(); void insert(string word) { TrieNode* p = phead; for (char ch : word) { if (p->next[ch - 'a'] == nullptr) { p->next[ch - 'a'] = new TrieNode(); } else { p->next[ch - 'a']->cnt++; } p = p->next[ch - 'a']; } p->end = true; } int prefixNumber(string pre) { int ans = INT_MAX; TrieNode* p = phead; for (char ch : pre) { if (p->next[ch - 'a'] == nullptr) return 0; ans = min(ans, p->next[ch - 'a']->cnt); p = p->next[ch - 'a']; } return ans; } void Delete(string word) { TrieNode* p = phead; for (char ch : word) { if (p->next[ch - 'a']->cnt == 1) { p->next[ch - 'a'] = nullptr; return; } else { p->next[ch - 'a']->cnt--; p = p->next[ch - 'a']; } } } bool search(string word) { TrieNode* p = phead; for (char ch : word) { if (p->next[ch - 'a'] == nullptr) return false; p = p->next[ch - 'a']; } return p->end; } vector<string> trieU(vector<vector<string> >& operators) { // write code here vector<string> ans; for (auto op : operators) { string num = op[0], word = op[1]; if (num == "1") insert(word); else if (num == "2") Delete(word); else if (num == "3") { if (search(word)) { ans.push_back("YES"); } else { ans.push_back("NO"); } } else if (num == "4") { int cnt = prefixNumber(word); ans.push_back(to_string(cnt)); } } return ans; } };