Cod sursa(job #713000)

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