Pagini recente » Cod sursa (job #1040764) | Cod sursa (job #825732) | Cod sursa (job #1973941) | Cod sursa (job #3175964) | Cod sursa (job #1959075)
#include <stdio.h>
#include <string.h>
using namespace std;
FILE *fin = fopen("trie.in", "r"), *fout = fopen("trie.out", "w");
char *s = new char[23];
struct Trie {
int cnt, nrfii;
Trie *fii[26];
Trie() {
cnt = nrfii = 0;
memset(fii, 0, sizeof(fii));
}
};
Trie *T = new Trie;
#define ch *s - 'a'//caracterul curent
void adauga(Trie *nod, char *s) {
if(*s == '\n') {
nod -> cnt++;
return;
}
if((nod -> fii[ch]) == 0) {
nod -> fii[ch] = new Trie;
nod -> nrfii++;
}
adauga(nod -> fii[ch], s + 1);
}
bool sterge(Trie *nod, char *s) {
if(*s == '\n')
nod -> cnt--;
else if(sterge(nod -> fii[ch], s + 1)) {
nod -> nrfii--;
nod -> fii[ch] = 0;//il marchezi pentru adaugat
}
if(nod -> cnt == 0 && nod -> nrfii == 0 && nod != T) {
delete nod;
return 1;
}
return 0;
}
int apar(Trie *nod, char *s) {
if(*s == '\n')
return nod -> cnt;
if(nod -> fii[ch]) {
return apar(nod -> fii[ch], s + 1);
}
return 0;
}
int tot;
void pref(Trie *nod, char *s) {
if(*s == '\n')
return;
if(nod -> fii[ch]) {
tot++;
pref(nod -> fii[ch], s + 1);
}
}
int main() {
int op;
fscanf(fin, "%d ", &op);
fgets(s, 21, fin);
while(!feof(fin)) {
switch(op) {
case 0://adauga aparitia
adauga(T, s);
break;
case 1://sterge aparitia
sterge(T, s);
break;
case 2://tipareste numarul de aparitii
fprintf(fout, "%d\n", apar(T, s));
break;
case 3://tipareste lungimea celui mai lung prefix comun al aparitiei cu oricare alt cuvant
tot = 0;
pref(T, s);
fprintf(fout, "%d\n", tot);
break;
}
fscanf(fin, "%d ", &op);
fgets(s, 21, fin);
}
fclose(fin);
fclose(fout);
return 0;
}