Pagini recente » Cod sursa (job #2434787) | Cod sursa (job #764901) | Cod sursa (job #2304178) | Cod sursa (job #2936904) | Cod sursa (job #2146623)
#include <cstdio>
#include <cstring>
struct trie {
int nfii, cnt;
trie *urm[30];
trie() {
nfii = cnt = 0;
memset(urm, 0, sizeof(urm));
}
};
trie *inc = new trie;
char s[30];
void add(trie *t, char *s) {
int c;
while (*s > 0) {
c = *s-'a';
if (t -> urm[c] == 0)
t -> urm[c] = new trie, t -> nfii++;
t = t -> urm[c];
s++;
}
t -> cnt++;
}
bool _delete(trie *t, char *s) {
if (*s == 0 && t -> cnt > 0) t -> cnt--;
else if (t -> urm[*s-'a'] && _delete(t -> urm[*s-'a'], s+1))
t -> urm[*s-'a'] = 0, t -> nfii--;
if (t -> cnt == 0 && t -> nfii == 0 && t != inc) {
delete t;
return 1;
}
return 0;
}
int cer1(trie *t, char *s) {
if (*s == 0) return t -> cnt;
if (t -> urm[*s-'a']) return cer1(t->urm[*s-'a'], s+1);
return 0;
}
int cer2(trie *t, char *s, int K) {
if (t -> urm[*s-'a'] == 0 || *s == 0)
return K;
return cer2(t -> urm[*s-'a'], s+1, K+1);
}
int main() {
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
while (gets(s)) {
if (s[0] == '0') add(inc, s+2);
else if (s[0] == '1') _delete(inc, s+2);
else if (s[0] == '2') printf("%d\n", cer1(inc, s+2));
else printf("%d\n", cer2(inc, s+2, 0));
}
}