Pagini recente » Cod sursa (job #2263143) | Cod sursa (job #2349045) | Cod sursa (job #355106) | Cod sursa (job #1799724) | Cod sursa (job #2288524)
#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(char* s, trie* nod, int poz, int l) {
if(poz == l) {
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, l);
}
}
static bool erase_word(char* s, trie* nod, int poz, int l) {
if(poz == l) {
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, l))
{
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(char* s, trie* nod, int poz, int l) {
if(poz == l)
return nod -> fr;
if(nod -> edge[s[poz] - 'a'] == NULL)
return 0;
return find_fr(s, nod -> edge[s[poz] - 'a'], poz + 1, l);
}
static int find_prefix(char* s, trie* nod, int poz, int l) {
if(poz == l)
return poz;
if(nod -> edge[s[poz] - 'a'] == NULL)
return poz;
return find_prefix(s, nod -> edge[s[poz] - 'a'], poz + 1, l);
}
};
trie *Trie = new trie;
char arr[100005];
int main() {
int tip;
string s;
while(in >> tip >> s) {
int i = -1;
for (auto ch : s)
arr[++i] = ch;
i++;
if(tip == 0)
Trie -> add_word(arr, Trie, 0, i);
else if(tip == 1)
Trie -> erase_word(arr, Trie, 0, i);
else if(tip == 2)
out << Trie -> find_fr(arr, Trie, 0, i) << "\n";
else
out << Trie -> find_prefix(arr, Trie, 0, i) << "\n";
i = -1;
for (auto ch : s)
arr[++i] = 0;
}
return 0;
}