Pagini recente » Cod sursa (job #2052568) | Cod sursa (job #1784792) | Cod sursa (job #953079) | Cod sursa (job #1283040) | Cod sursa (job #2008077)
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
struct Trie{
Trie *fii[26];
int nrfii;
int nrcuv;
Trie() {
nrfii = nrcuv = 0;
memset(fii, 0, sizeof(fii));
}
};
Trie *radacina = new Trie;
void add(Trie *rad, char *c){
int lg = strlen(c);
for(int i = 0; i < lg; ++i){
if(rad->fii[c[i] - 'a'] == 0){
rad->fii[c[i] - 'a'] = new Trie;
rad->nrfii++;
}
rad = rad->fii[c[i] - 'a'];
}
rad->nrcuv++;
}
bool del(Trie *rad, char *c){
if (*c == 0) {
rad->nrcuv--;
if (rad->nrcuv == 0 && rad->nrfii == 0)
return true;
return false;
}
if (rad->fii[*c - 'a'] == 0) {
return false;
}
if (del(rad->fii[*c - 'a'], c + 1) == true) {
delete rad->fii[*c - 'a'];
rad->fii[*c - 'a'] = NULL;
rad->nrfii--;
}
if (rad->nrcuv == 0 && rad->nrfii == 0) {
return true;
}
return false;
}
int nrAp(Trie *rad, char *c){
int lg = strlen(c);
for(int i = 0; i < lg; ++i){
if(rad->fii[c[i] - 'a'] == 0){
return 0;
}
rad = rad->fii[c[i] - 'a'];
}
return rad->nrcuv;
}
int lcmmpc(Trie *rad, char *c){
int lg = strlen(c);
for(int i = 0; i < lg; ++i){
if(rad->fii[c[i] - 'a'] == 0){
return i;
}
rad = rad->fii[c[i] - 'a'];
}
return lg;
}
int main() {
freopen( "trie.in", "r", stdin );
freopen( "trie.out", "w", stdout );
int op;
while(cin >> op){
char cuv[25];
cin >> cuv;
if(op == 0){
add(radacina, cuv);
}
else if(op == 1){
del(radacina, cuv);
}
else if(op == 2){
cout << nrAp(radacina, cuv) << '\n';
}
else {
cout << lcmmpc(radacina, cuv) << '\n';
}
}
return 0;
}