Pagini recente » Cod sursa (job #405175) | Cod sursa (job #2180731) | Cod sursa (job #1946714) | Cod sursa (job #2200843) | Cod sursa (job #1110431)
#include <fstream>
#include <cstdio>
#include <cstring>
using namespace std;
ifstream fin ("trie.in");
ofstream fout ("trie.out");
#define get_n(X) (X - 'a')
class Nod {
public:
int count;
Nod *son[27];
int sons;
Nod() {
count = sons = 0;
memset(son, 0, sizeof(son));
}
};
Nod* start = new Nod;
class Trie {
public:
void insert(Nod* X, char* p) {
if(*p == '\0') {
X -> count++;
return ;
}
if(X -> son[get_n(*p)] == 0) {
X -> son[get_n(*p)] = new Nod;
X -> sons ++;
}
insert(X -> son[get_n(*p)], p + 1);
}
bool del(Nod * X, char *p) {
if(*p == '\0') {
X -> count--;
} else if(del(X -> son[get_n(*p)], p + 1)) {
X -> son[get_n(*p)] = 0;
X -> sons --;
}
if( X -> sons == 0 && X -> count == 0 && X != start) {
delete X; return true;
}
return false;
}
int frec(Nod *X, char *p) {
if(*p == '\0')
return X -> count;
frec(X -> son[get_n(*p)], p + 1);
}
int prefix(Nod* X, char *p, int lev) {
if(*p == '\0')
return lev;
if(X -> son[get_n(*p)] == 0)
return lev;
else return prefix(X -> son[get_n(*p)],p + 1, lev + 1);
}
} T;
int main() {
int type; char s[30];
while(fin >> type >> s + 1) {
if(type == 0) T.insert(start, s + 1);
if(type == 1) T.del(start, s + 1);
if(type == 2) fout << T.frec(start, s + 1) << '\n';
if(type == 3) fout << T.prefix(start, s + 1, 0) << '\n';
}
return 0;
}