Pagini recente » Cod sursa (job #418129) | Monitorul de evaluare | Cod sursa (job #1894512) | simulare-cartita-48 | Cod sursa (job #1857409)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int x, y, i, c;
char s[30];
struct trie {
int nfii, cnt;
trie* fi[30];
trie() {
nfii = 0, cnt = 0;
memset(fi, 0, sizeof(fi));
}
};
trie *inc = new trie;
void add(trie *t, char *s) {
if (*s < 'a') {
t -> cnt++;
return;
}
if (t -> fi[*s-'a'] == 0)
t -> fi[*s-'a'] = new trie, t -> nfii++;
add(t -> fi[*s-'a'],s+1);
}
bool remove(trie *t, char *s) {
if(!(*s>='a'&&*s<='z')) {
if (t -> cnt)
t -> cnt--;
}
else if (remove(t -> fi[*s-'a'], s+1))
t -> nfii--, t -> fi[*s-'a'] = 0;
if (t -> nfii == 0 && t -> cnt == 0 && t != inc) {
delete t;
return 1;
}
return 0;
}
int query1(trie *t, char *s) {
if (*s < 'a')
return t -> cnt;
if (t -> fi[*s-'a'])
return query1(t -> fi[*s-'a'], s+1);
return 0;
}
int query2(trie *t, char *s, int l) {
if (*s < 'a' || t -> fi[*s-'a'] == 0)
return l;
if (t -> fi[*s-'a'])
return query2(t -> fi[*s-'a'], s+1, l+1);
return 0;
}
int main() {
while(f.getline(s, sizeof(s))) {
if (s[0] == '0')
add(inc, s+2);
else if (s[0] == '1')
remove(inc,s+2);
else if (s[0] == '2')
g << query1(inc,s+2) <<'\n';
else
g << query2(inc,s+2, 0) <<'\n';
}
return 0;
}