Pagini recente » Cod sursa (job #1654584) | Cod sursa (job #238460) | Cod sursa (job #1068930) | Cod sursa (job #1029090) | Cod sursa (job #1862124)
#include <fstream>
#include <cstring>
#define B *s-'a'
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct trie {
int nfii, cnt;
trie *fii[30];
trie() {
nfii=cnt=0;
memset(fii,0,sizeof(fii));
}
};
trie *inc=new trie;
char s[40];
void adaug(trie *t, char *s) {
if (*s < 'a') {
t -> cnt++;
return;
}
if (t->fii[B]==0)
t -> fii[B] = new trie,t->nfii++;
adaug(t->fii[B],s+1);
}
bool sterg(trie *t, char *s) {
if (*s<'a'&&t->cnt)
t->cnt--;
else if (t->fii[B]&&sterg(t->fii[B],s+1)) {
t->fii[B]=0;
t -> nfii--;
}
if (t->cnt==0&&t->nfii==0) {
delete t;
return 1;
}
return 0;
}
int query1(trie *t, char *s) {
if (*s < 'a') {
return t -> cnt;
}
if (t -> fii[B])
return query1(t->fii[B], s+1);
return 0;
}
int query2(trie *t, char *s) {
if (*s<'a')
return 0;
if (t -> fii[B])
return query2(t->fii[B],s+1)+1;
return 0;
}
int main() {
while (f.getline(s, sizeof(s))) {
if (s[0] == '0')
adaug(inc,s+2);
else if (s[0] == '1')
sterg(inc,s+2);
else if (s[0] == '2')
g << query1(inc,s+2)<<'\n';
else
g << query2(inc,s+2)<<'\n';
}
return 0;
}