Pagini recente » Cod sursa (job #2942938) | Cod sursa (job #2950522) | Cod sursa (job #461655) | Cod sursa (job #457110) | Cod sursa (job #2636172)
#include <stdio.h>
#include <stack>
#define NMAX 100005
FILE* fin, * fout;
struct nod {
char c = 0;
int aparitii = 0, sfarsit = 0;
nod* urm[26] = { 0 };
}*rad;
void adauga(const char* s) {
nod* n = rad;
for (int i = 0;s[i] != '\0';++i) {
char c = s[i] - 'a';
if (n->urm[c] == NULL)
n->urm[c] = new nod;
nod* e = n->urm[c];
e->c = c;
++e->aparitii;
n = e;
}
++n->sfarsit;
}
void sterge(const char* s) {
std::stack<nod**> st;
nod* n = rad;
for (int i = 0;s[i] != '\0';++i) {
char c = s[i] - 'a';
st.push(&n->urm[c]);
n = n->urm[c];
}
--n->sfarsit;
while (!st.empty()) {
nod** e = st.top();
st.pop();
--(*e)->aparitii;
if ((*e)->aparitii == 0) {
*e = NULL;
delete* e;
}
}
}
int aparitii(const char* s) {
nod* n = rad;
for (int i = 0;s[i] != '\0';++i) {
char c = s[i] - 'a';
if (n->urm[c] == NULL)
return 0;
n = n->urm[c];
}
return n->sfarsit;
}
int prefix(const char* s) {
nod* n = rad;
int nr = 0;
for (int i = 0;s[i] != '\0';++i) {
char c = s[i] - 'a';
if (n->urm[c] == NULL)
return nr;
++nr;
n = n->urm[c];
}
return nr;
}
void afis(nod* n = rad) {
if (n == NULL)
return;
printf("%c %i %i\n", n->c + 'a', n->aparitii, n->sfarsit);
for (int i = 0;i < 26;++i)
afis(n->urm[i]);
}
int main() {
fin = fopen("trie.in", "r");
fout = fopen("trie.out", "w");
rad = new nod;
int t;
char s[21];
while (fscanf(fin, "%i %s", &t, s) > 0) {
if (t == 0) {
adauga(s);
}
else if (t == 1) {
sterge(s);
}
else if (t == 2) {
fprintf(fout, "%i\n", aparitii(s));
}
else {
fprintf(fout, "%i\n", prefix(s));
}
/*printf("AFIS: %i %s\n", t, s);
afis();*/
}
return 0;
}