Pagini recente » Cod sursa (job #1967403) | Cod sursa (job #2127786) | Cod sursa (job #359422) | Cod sursa (job #2372905) | Cod sursa (job #1965756)
#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct trie {
int nfii, cnt;
trie *k[30];
trie() {
memset(k,0,sizeof(k));
nfii=cnt=0;
}
};
trie *inc;
char s[40];
void inser(trie *t, char *k) {
while (*k >= 'a') {
int c = *k-'a';
if (t -> k[c] == 0) t -> k[c] = new trie, t->nfii++;
t = t -> k[c];
k++;
}
t -> cnt++;
}
bool delet(trie *t, char *k) {
int c = *k-'a';
if (*k < 'a')
t -> cnt--;
else if (t -> k[c] && delet(t -> k[c], k+1))
t -> k[c] = 0, t -> nfii--;
if (t -> nfii == 0 && t -> cnt == 0 && t != inc) {
delete t;
return 1;
}
return 0;
}
int q1(trie *t, char *k) {
if (*k < 'a') return t -> cnt;
if (t -> k[*k-'a']) return q1(t -> k[*k-'a'], k+1);
return 0;
}
int q2(trie *t, char *k, int K) {
if (t -> k[*k-'a'] == 0) return K;
else return q2(t -> k[*k-'a'], k+1, K+1);
//cout<<*k <<' ' << K<<'\n';
return 0;
}
int main() {
inc = new trie;
while (f.getline(s, sizeof(s))) {
if (s[0] == '0') inser(inc, s+2);
else if (s[0] == '1') delet(inc, s+2);
else if (s[0] == '2') g << q1(inc, s+2) << '\n';
else cout<<'\n',g << q2(inc,s+2,0)<<'\n';
}
}