Pagini recente » Cod sursa (job #1340709) | Cod sursa (job #2278637) | Cod sursa (job #2231243) | Cod sursa (job #2138345) | Cod sursa (job #712993)
Cod sursa(job #712993)
//trie - 12.03.2012
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
ofstream fout ("trie.out");
int nr=0,nri=0;//for debugging
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
{ //'a'=97
t->nr_fii--;
//if (t->nr_fii==0) return; //daca niciun cuvant nu mai trece prin nodul curent
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])
{
if (strcmp(c,"surmenare")==0)
cout<<"1847"<<' '<<nr
;
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
{ //'a'=97
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())
{
if (strcmp(c,"surmenare")==0)
cout<<"1847"<<' '<<nr
;
cout<<c<<'\n';
nr++;
if (op>=2) nri++;
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();
cout<<nr;
}