Pagini recente » Cod sursa (job #381375) | Cod sursa (job #20510) | Cod sursa (job #2090219) | Cod sursa (job #1572229) | Cod sursa (job #2596699)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct TrieNode{
int total, ends;
map<char, TrieNode*> next;
TrieNode(int _total = 0, int _ends = 0):
total(_total), ends(_ends){next.clear();}
};
int task, l;
string s;
TrieNode* root;
void append(int pos, TrieNode* now);
void elim(int pos, TrieNode* now);
int countApp(int pos, TrieNode* now);
int findPrefix(int pos, TrieNode* now);
int main()
{
root = new TrieNode();
while(fin >> task){
fin >> s;
l = s.length();
switch(task){
case 0:{append(0, root); break;}
case 1:{elim(0, root); break;}
case 2:{fout << countApp(0, root) << "\n"; break;}
default: fout << findPrefix(0, root) + 1 << "\n";
}
}
return 0;
}
void append(int pos, TrieNode* now){
++now->total;
if(pos == l) {
++now->ends;
return;
}
if(now->next.find(s[pos]) == now->next.end()) {
now->next.insert({s[pos], new TrieNode()});
}
append(pos + 1, now->next[s[pos]]);
}
void elim(int pos, TrieNode* now){
--now->total;
if(pos == l){
--now->ends;
return;
}
elim(pos + 1, now->next[s[pos]]);
if(now->next[s[pos]]->total == 0){
delete now->next[s[pos]];
now->next.erase(now->next.find(s[pos]));
}
}
int countApp(int pos, TrieNode* now){
if(pos == l) return now->ends;
return countApp(pos + 1, now->next[s[pos]]);
}
int findPrefix(int pos, TrieNode* now){
if(!pos && now->total == 1) return -1;
if(pos == l) return pos - 1;
if(now->next[s[pos]]->total > 1) return findPrefix(pos + 1, now->next[s[pos]]);
else return pos;
}