Pagini recente » Cod sursa (job #1405375) | Cod sursa (job #106442) | Cod sursa (job #369238) | Cod sursa (job #342332) | Cod sursa (job #2844788)
#include <fstream>
#include <cstring>
#define CH (*s - 'a')
using namespace std;
ifstream fin ("trie.in");
ofstream fout("trie.out");
const int LEN = 26;
struct Trie {
int cnt, nrfii;
Trie *fiu[LEN];
Trie() {
cnt = nrfii = 0;
memset(fiu, 0, sizeof(fiu));
}
};
Trie *t = new Trie;
void close();
void Solve();
void add(Trie *t, char *s);
int del(Trie *t, char *s);
int get_occ(Trie *t, char *s);
int aparitii(Trie *t, char *s, int k);
int main() {
Solve();
close();
return 0;
}
void Solve() {
int x;
char s[20];
while (fin >> x >> s) {
switch (x) {
case 0:
add(t, s);
break;
case 1:
del(t, s);
break;
case 2:
fout << get_occ(t, s) << '\n';
break;
case 3:
fout << aparitii(t, s, 0) << '\n';
break;
default:
break;
}
}
}
void add(Trie *nod, char *s) {
if (*s == '\0') {
nod->cnt ++;
return;
}
if (nod->fiu[CH] == 0) {
nod->fiu[CH] = new Trie;
nod->nrfii ++;
}
add(nod->fiu[CH], s+1);
}
int del(Trie *nod, char *s) {
if (*s == '\0')
nod->cnt --;
else if (del(nod->fiu[CH], s+1)) {
nod->fiu[CH] = 0;
nod->nrfii --;
}
if (nod->cnt == 0 && nod->nrfii == 0 && nod != t) {
delete nod;
return 1;
}
return 0;
}
int get_occ(Trie *nod, char *s) {
if (*s == '\0')
return nod->cnt;
if (nod->fiu[CH])
return get_occ(nod->fiu[CH], s+1);
return 0;
}
int aparitii(Trie *nod, char *s, int k) {
if (*s == '\0' || nod->fiu[CH] == 0)
return k;
return aparitii(nod->fiu[CH], s+1, k+1);
}
void close() {
fin.close();
fout.close();
}