Pagini recente » Cod sursa (job #2240808) | Cod sursa (job #1236621) | football2 | Cod sursa (job #3194912) | Cod sursa (job #2288513)
#include <fstream>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
class trie {
public:
trie *edge[26];
int fr;
int sons;
trie() {
sons = 0;
fr = 0;
for(int i = 0; i < 26; i++)
edge[i] = NULL;
}
static void add_word(string s, trie* nod, int poz) {
if(poz == s.size()) {
nod -> fr++;
return;
}
else {
if(nod -> edge[s[poz] - 'a'] == NULL) {
nod -> edge[s[poz] - 'a'] = new trie;
nod -> sons++;
}
add_word(s, nod -> edge[s[poz] - 'a'], poz + 1);
}
}
static bool erase_word(string s, trie* nod, int poz) {
if(poz == s.size()) {
nod -> fr--;
if(nod -> fr == 0 && nod -> sons == 0) {
delete nod;
return true;
}
return false;
}
else {
if(erase_word(s, nod -> edge[s[poz] - 'a'], poz + 1))
{
nod -> sons--;
nod -> edge[s[poz] - 'a'] = NULL;
}
if(nod -> fr == 0 && nod -> sons == 0 && poz != 0) {
delete nod;
return true;
}
return false;
}
}
static int find_fr(string s, trie* nod, int poz) {
if(poz == s.size())
return nod -> fr;
if(nod -> edge[s[poz] - 'a'] == NULL)
return 0;
return find_fr(s, nod -> edge[s[poz] - 'a'], poz + 1);
}
static int find_prefix(string s, trie* nod, int poz) {
if(poz == s.size())
return poz;
if(nod -> edge[s[poz] - 'a'] == NULL)
return poz;
return find_prefix(s, nod -> edge[s[poz] - 'a'], poz + 1);
}
};
trie *Trie = new trie;
int main() {
int tip;
string s;
while(in >> tip >> s) {
if(tip == 0)
Trie -> add_word(s, Trie, 0);
else if(tip == 1)
Trie -> erase_word(s, Trie, 0);
else if(tip == 2)
out << Trie -> find_fr(s, Trie, 0) << "\n";
else
out << Trie -> find_prefix(s, Trie, 0) << "\n";
}
return 0;
}