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