Pagini recente » Cod sursa (job #1660718) | Cod sursa (job #1519268) | Cod sursa (job #2032991) | Cod sursa (job #316045) | Cod sursa (job #2324375)
#include <bits/stdc++.h>
using namespace std;
FILE *fin = fopen ("trie.in", "r"), *fout = fopen ("trie.out", "w");
const int MAXN = 100;
struct Trie {
int nr, cnt;
Trie *fiu[26];
Trie () {
nr = cnt = 0;
memset (fiu, 0, sizeof (fiu));
}
};
Trie *T = new Trie;
void update (Trie *nod, char *s) {
if (*s == NULL) {
nod->cnt++;
return;
}
if (nod->fiu[*s - 'a'] == 0) {
nod->fiu[*s - 'a'] = new Trie;
nod->nr++;
}
update (nod->fiu[*s - 'a'], s + 1);
}
bool erase (Trie *nod, char *s) {
if (*s == NULL) {
nod->cnt--;
}
else if (erase (nod->fiu[*s - 'a'], s + 1)) {
nod->nr--;
nod->fiu[*s - 'a'] = 0;
}
if (nod->cnt == 0 && nod != T && nod->nr == 0) {
delete nod;
return 1;
}
return 0;
}
int query (Trie *nod, char *s) {
if (*s == NULL)
return nod->cnt;
if (nod->fiu[*s - 'a'] == NULL)
return 0;
return query (nod->fiu[*s - 'a'], s + 1);
}
int prefix (Trie *nod, char *s, int k) {
if (*s == NULL)
return k;
if (nod->fiu[*s - 'a'] == NULL)
return k;
return prefix (nod->fiu[*s - 'a'], s + 1, k + 1);
}
char s[MAXN + 1];
int main() {
int op;
while (!feof (fin)) {
fscanf (fin, "%d", &op);
fscanf (fin, "%s\n", &s);
if (op == 0) {
update (T, s);
}
else if (op == 1) {
bool _ = erase (T, s);
}
else if (op == 2) {
fprintf (fout, "%d\n", query (T, s));
}
else {
fprintf (fout, "%d\n", prefix (T, s, 0));
}
}
fclose (fin);
fclose (fout);
return 0;
}