Cod sursa(job #712993)

Utilizator dany123Florea Daniel dany123 Data 13 martie 2012 23:33:04
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.41 kb
//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;
}