Pagini recente » Cod sursa (job #988683) | Cod sursa (job #2823775) | Cod sursa (job #1871301) | Cod sursa (job #1598348) | Cod sursa (job #1584823)
#include<fstream>
using namespace std;
//int ;
struct nod
{
int nr;
int nf;
nod *F[26];
nod()
{
nr=0;
nf=0;
for(int i=0; i<26; i++)
{
F[i]=0;
}
}
};
nod *rad;
void inserare(nod *p, char *s) {
if (*s != 0) {
// incerc sa ma uit din p spre campul de adresa
// corespunzator caracterului curent
if (p->F[ *s-'a' ] == NULL) {
p->F[ *s-'a' ] = new nod;
p->nf++;
}
inserare(p -> F[ *s - 'a' ], s+1);
} else {
p->nr ++; // se termina cuvantul si notez numarul sau de aparitii
}
}
int aparitii (nod *p, char *s) {
if (*s == 0)
return p->nr;
if (p->F[ *s - 'a' ] == NULL)
return 0;
return aparitii(p->F[ *s - 'a' ], s+1);
}
int prefix (nod *p, char *s) {
if (*s == 0)
return 0;
if (p->F[ *s - 'a' ] == NULL)
return 0;
return 1 + prefix(p->F[ *s - 'a' ], s+1);
}
void stergTrie(nod *p) {
if (p!=NULL) {
for (int i=0;i<26;i++)
if (p->F[i] != NULL)
stergTrie(p->F[i]);
delete p;
}
}
int sterge(nod *p, char *s) {// returneaza 1 daca revine din autoapel stergand
if (*s == 0) {
p->nr --;
if (p->nr == 0) {
if (p->nf == NULL) {
delete p;
return 1;
}
}
return 0;
}
if ( p->F[*s - 'a'] == NULL)
return 0;
int d = sterge(p->F[*s - 'a'], s+1);
if (d == 0)
return 0;
// revin din autoapel si am sters acolo
p->F[*s - 'a'] = NULL;
p->nf --;
if (p->nf == 0 && p->nr == 0 && p!=rad) {
delete p;
return 1;
}
return 0;
}
ifstream in("trie.in");
ofstream out("trie.out");
int op;
char s[22];
int main()
{
rad=new nod;
while(in>>op)
{
in>>s;
if(op==0)
{
inserare(rad, s);
continue;
}
if (op == 1) {
sterge(rad, s);
continue;
}
if (op == 2) {
// numarul de aparitii
out<<aparitii(rad, s)<<"\n";
continue;
}
if (op == 3) {
// numarul de aparitii
out<<prefix(rad, s)<<"\n";
continue;
}
}
return 0;
}