Pagini recente » Cod sursa (job #1346306) | Cod sursa (job #700098) | Profil RaresLiscan | Rating DaryuF (daryuf) | Cod sursa (job #1152183)
#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct Trie {
Trie *copii[27];
int ncopii;
int contor;
Trie() {
ncopii = contor = 0;
memset(copii, 0, sizeof(copii));
}
};
Trie *T;
void add(Trie *Tr, char *x) {
if (*x == 0) {
Tr->contor++;
return;
}
if (Tr->copii[*x - 'a'] == 0) {
Tr->copii[*x - 'a'] = new Trie();
Tr->ncopii++;
}
add(Tr->copii[*x - 'a'], x + 1);
}
int del(Trie *Tr, char *x) {
if (*x == 0) {
Tr->contor--;
} else {
if (del(Tr->copii[*x - 'a'], x + 1)) {
//am sters nod-ul
Tr->copii[*x - 'a'] = 0;
Tr->ncopii--;
}
}
if (Tr->ncopii == 0 && Tr->contor == 0 && T != Tr) {
delete Tr;
return 1;
}
return 0;
}
int aparitii(Trie *Tr, char *x) {
if (*x == 0)
return Tr->contor;
return aparitii(Tr->copii[*x - 'a'], x + 1);
}
int prefix(Trie *Tr, char *x, int k) {
if (*x == 0 || Tr->copii[*x - 'a'] == 0)
return k;
return prefix(Tr->copii[*x - 'a'], x + 1, k + 1);
}
int main() {
char str[30];
int n;
T = new Trie();
in>>n>>str;
do {
if (n == 0){
add(T, str);
}
if (n == 1) {
del(T, str);
}
if (n == 2) {
out<<aparitii(T, str)<<"\n";
}
if (n == 3) {
out<<prefix(T, str, 0)<<"\n";
}
in>>n>>str;
} while (in.good());
return 0;
}