Pagini recente » Cod sursa (job #3199525) | Cod sursa (job #2124677) | Cod sursa (job #2114829) | Cod sursa (job #611994) | Cod sursa (job #713000)
Cod sursa(job #713000)
//trie - 12.03.2012
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
ofstream fout ("trie.out");
struct nod {
nod * v[26];
int nr_cuv; //numarul de cuvinte terminate in nodul curent
int nr_fii; //numarul de cuvinte care trec prin nodul (litera) curenta
nod () //constructor
{
nr_cuv=0;
nr_fii=0;
for (int i=0;i<=26;++i) v[i]=0x0;
}
}* T = new nod;
void add (char c[21])
{
int i=0;
nod * t = T;
while (i<=strlen(c))
{
if (i==strlen(c)) //daca am ajuns la sfarsitul cuvantului, nr_cuv++
{
t->nr_cuv++;
return;
}
else if (t->v[c[i]-97] != 0) //'a'=97 //daca exista nodul
{
t->nr_fii++;
t=t->v[c[i]-97]; //pointerul indica urmatorul nod
i++;//trecem la litera urmatoare
}
else if (t->v[c[i]-97] == 0x0) //daca nu exista nod coresp
{
t->v[c[i]-97] = new nod; //adaugam nodul corespunzator literei
t->nr_fii++;
t = t->v[c[i]-97]; //pointerul indica spre noul nod
i++; //si trecem la litera urmatoare
}
else fout<<"ER: ramura 4 add\n";
}
fout<<"ER: end of fct add\n";
}
void del (char c[21])
{
int i=0;
nod * t = T;
while (i<=strlen(c))
{
if (i==strlen(c)) //daca am ajuns la sfarsitul cuvantului
{
t->nr_cuv--;
return;
}
else if (t->v[c[i]-97] != 0x0) //daca exista nodul
{
t->nr_fii--;
t=t->v[c[i]-97]; //pointerul indica urmatorul nod
i++; //trecem la litera urmatoare
}
else fout<<"ER: ramura 3 del\n";
}
fout<<"ER: end of fct del\n";
}
void nr_aparitii (char c[21])
{
int i=0;
nod * t = T;
while (i<=strlen(c))
{
if (i==strlen(c)) //daca am ajuns la sfarsitul cuvantului
{
fout<<t->nr_cuv<<'\n';
return;
}
else if (t->v[c[i]-97] != 0x0) //daca exista nodul
{
t=t->v[c[i]-97]; //pointerul indica urmatorul nod
i++;//trecem la litera urmatoare
}
else //deci nu exista cuvantul in trie
{
fout<<0<<'\n';
return;
}
}
fout<<"ER: end of fct nr_apar\n";
}
void cmlprefix (char c[21])
{
int i=0;
nod * t = T;
int pref_max=0;
while (i<=strlen(c))
{
if (i==strlen(c)) //daca am ajuns la sfarsitul cuvantului (deci exista cu totul in trie)
{
fout<<strlen(c)<<'\n'; //returnam lungimea lui c
return;
}
else if (t->v[c[i]-97] != 0x0) //daca exista nodul
{ //'a'=97
t=t->v[c[i]-97]; //pointerul indica urmatorul nod
if (t->nr_fii==0 && t->nr_cuv==0) //daca prin nodul urmator nu mai trece niciun cuvant
{
fout<<i<<'\n'; //aici e finalul
return;
}
else
{
i++;//trecem la litera urmatoare
pref_max=i;//i incepe de la 0 deci i+1 e corect
}
}
else if (t->v[c[i]-97] == 0x0) //daca nu exista nodul
{
fout<<pref_max<<'\n';
return;
}
else fout<<"ER: ramura 3 cml\n";
}
fout<<"ER: end of fct cml\n";
}
int main ()
{
ifstream fin("trie.in");
int op;
char c[21];
while(!fin.eof())
{
fin>>op>>c;
if(fin.good()) //fara el ultimul nr apare de 2 ori
{
if (op==0) add(c);
else if (op==1) del(c);
else if (op==2) nr_aparitii(c);
else if (op==3) cmlprefix(c);
}
}
fin.close();
fout.close();
}