Pagini recente » Cod sursa (job #1356470) | Cod sursa (job #1820880) | Cod sursa (job #224570) | Cod sursa (job #134623) | Cod sursa (job #1138636)
#include <stdio.h>
#include <cstring>
using namespace std;
struct Trie {
int cnt, nrfii;
Trie *fiu[26];
Trie() {
cnt = nrfii = 0;
memset( fiu, 0, sizeof( fiu ) );
}
};
Trie *T = new Trie;
void ins (Trie *nod, char *s) {
if (*s == '\n') {
nod->cnt++; //am adaugat un cuvant
return;
}
if (nod->fiu[*s-'a'] == 0) { //daca nu exista litera
nod->fiu[*s-'a'] = new Trie;
nod->nrfii++;
}
ins (nod->fiu[*s-'a'], s+1); //litera urmatoare
}
int del (Trie *nod, char *s) {
if (*s == '\n')
nod->cnt--; //am eliminat un cuvant
else if (del (nod->fiu[*s-'a'], s+1)) { //am sters litera urmatoare
nod->fiu[*s-'a'] = 0;
nod->nrfii--;
}
if (nod->cnt == 0 && nod->nrfii == 0 && nod != T)
return 1;
return 0;
}
int que (Trie *nod, char *s) {
if (*s == '\n')
return nod->cnt; //am gasit cuvantul
if (nod->fiu[*s-'a'])
return que (nod->fiu[*s-'a'], s+1); //litera urmatoare
}
int pre (Trie *nod, char *s, int k) {
if (*s == '\n' || nod->fiu[*s-'a'] == 0)
return k; //am gasit cel mai lung prefix
return pre(nod->fiu[*s-'a'], s+1, k+1); //litera urmatoare, am marit lungimea prefixului
}
int main() {
freopen ("trie.in", "r", stdin);
freopen ("trie.out", "w", stdout);
char line[25], c;
int opt;
fgets (line, 25, stdin);
while (!feof (stdin)) {
switch (line[0]) {
case '0': ins (T, line + 2); break;
case '1': del (T, line + 2); break;
case '2': printf ("%d\n", que (T, line + 2)); break;
case '3': printf ("%d\n", pre (T, line + 2, 0)); break;
}
fgets (line, 25, stdin);
}
return 0;
}