Pagini recente » Cod sursa (job #639182) | Cod sursa (job #2808576) | Borderou de evaluare (job #3157649) | Cod sursa (job #98243) | Cod sursa (job #1864799)
#include <fstream>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cctype>
using namespace std;
#define Ch *s - 'a'
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie {
int cnt, nrfii;
Trie *fiu[26];
Trie() {
nrfii = cnt = 0;
memset(fiu, 0, sizeof(fiu));
}
};
Trie *mytrie = new Trie;
void ins(Trie *nod, char *s) {
if(*s == NULL) {
nod -> cnt++;
return;
}
if(nod -> fiu[Ch] == 0) {
nod -> fiu[Ch] = new Trie;
nod -> nrfii++;
}
ins(nod -> fiu[Ch], s + 1);
}
bool del(Trie *nod, char *s) {
if(*s == NULL) {
nod -> cnt--;
}
else if(del(nod -> fiu[Ch], s + 1)) {
nod -> fiu[Ch] = 0;
nod -> nrfii--;
}
if(nod -> cnt == 0 && nod -> nrfii == 0 && nod != mytrie) {
delete nod;
return true;
}
return false;
}
int ask(Trie *nod, char *s) {
if(*s == NULL) {
return nod -> cnt;
}
if(nod -> fiu[Ch]) {
return ask(nod -> fiu[Ch], s + 1);
}
return 0;
}
int prefix(Trie *nod, char *s, int nr) {
if(*s == NULL || nod -> fiu[Ch] == 0)
return nr;
return prefix(nod -> fiu[Ch], s + 1, nr + 1);
}
char cuv[25];
int main() {
int x;
fin >> x >> cuv;
while(!fin.eof()) {
switch(x) {
case 0:
ins(mytrie, cuv);
break;
case 1:
del(mytrie, cuv);
break;
case 2:
fout << ask(mytrie, cuv) << '\n';
break;
case 3:
fout << prefix(mytrie, cuv, 0) << '\n';
break;
}
fin >> x >> cuv;
}
fin.close();
fout.close();
return 0;
}