Pagini recente » Cod sursa (job #2117460) | Cod sursa (job #2111541) | Cod sursa (job #1205778) | Cod sursa (job #195371) | Cod sursa (job #2406605)
#include <fstream>
#include <cstring>
#include <cstdio>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
char a[32];
struct trie{
int cnt, nrfii;
trie *fiu[26];
trie() {
cnt = nrfii = 0;
memset(fiu, 0, sizeof(fiu));
}
} *T;
void ins(trie *nod, char *s) {
if (*s == '\n') { nod->cnt++; return; }
if (nod->fiu[*s - 'a'] == 0) { nod->fiu[*s - 'a'] = new trie; nod->nrfii++; }
ins(nod->fiu[*s - 'a'], s+1);
}
int del(trie *nod, char *s) {
if (*s == '\n') nod -> cnt--;
else if (del(nod -> fiu[*s - 'a'], s+1)) {
nod -> fiu[*s - 'a'] = 0;
nod -> nrfii--;
}
if (nod -> cnt == 0 && nod -> nrfii == 0 && nod != T) {
delete nod;
return 1;
}
return 0;
}
int ap(trie *nod, char *s) {
if (*s == '\n') return nod -> cnt;
if (nod -> fiu[*s - 'a']) return ap(nod -> fiu[*s - 'a'], s+1);
return 0;
}
int pre(trie *nod, char *s, int k) {
if (*s == '\n' || nod -> fiu[*s - 'a'] == 0) return k;
return pre(nod -> fiu[*s - 'a'], s+1, k+1);
}
int main()
{
freopen("trie.in", "r", stdin);
T = new trie;
fgets(a, 32, stdin);
while (!feof(stdin)) {
if (*a == '0') ins(T,a+2);
if (*a == '1') del(T,a+2);
if (*a == '2') g << ap(T,a+2) << '\n';
if (*a == '3') g << pre(T,a+2,0) << '\n';
fgets(a, 32, stdin);
}
return 0;
}