Pagini recente » Cod sursa (job #2750884) | Cod sursa (job #552096) | Cod sursa (job #122160) | Cod sursa (job #466115) | Cod sursa (job #379509)
Cod sursa(job #379509)
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
#define Nmax 20
struct Trie {
int nr_cuv, nr_fii;
Trie *fiu[26];
Trie () {
nr_cuv = nr_fii = 0;
memset (fiu, 0, sizeof(fiu));
}
};
Trie *R = new Trie;
int tip;
char s[Nmax];
void add (Trie *nod, char *s) {
if (*s == '\n') { nod->nr_cuv++; return ; }
if (!nod->fiu[*s - 'a']) {
nod->fiu[*s - 'a'] = new Trie;
nod->nr_fii++;
}
add (nod->fiu[*s - 'a'], s+1);
}
int del (Trie *nod, char *s) {
if (*s == '\n') {
nod->nr_cuv--;
if (nod != R && !nod->nr_cuv && !nod->nr_fii) {
delete nod;
return 1;
}
else
return 0;
}
if (!nod->fiu[*s - 'a'])
return 0;
if ( del (nod->fiu[*s - 'a'], s+1) ) {
nod->nr_fii--;
nod->fiu[*s - 'a'] = 0;
if (nod != R && !nod->nr_cuv && !nod->nr_fii) {
delete nod;
return 1;
}
else
return 0;
}
return 0;
}
int query (Trie *nod, char *s) {
if (*s == '\n')
return nod->nr_cuv;
if (!nod->fiu[*s - 'a'])
return 0;
return query (nod->fiu[*s - 'a'], s + 1);
}
int prefix (Trie *nod, char *s, int lg) {
if (*s == '\n')
return lg;
if (!nod->fiu[*s - 'a'])
return lg;
return prefix (nod->fiu[*s - 'a'], s + 1, lg + 1);
}
int main () {
FILE *f = fopen ("trie.in", "r");
FILE *g = fopen ("trie.out", "w");
fscanf (f, "%d %s", &tip, s); s[strlen(s)] = '\n';
while (!feof (f)) {
switch (tip) {
case 0 : add (R, s); break;
case 1 : del (R, s); break;
case 2 : fprintf (g, "%d\n", query (R, s)); break;
case 3 : fprintf (g, "%d\n", prefix (R, s, 0)); break;
}
memset (s, 0, sizeof (0));
fscanf (f, "%d %s", &tip, s); s[strlen(s)] = '\n';
}
fclose (f);
fclose (g);
return 0;
}