Cod sursa(job #710865)

Utilizator vlad.doruIon Vlad-Doru vlad.doru Data 10 martie 2012 22:24:26
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#include <fstream>
#include <string>

using namespace std;

ifstream in("trie.in");
ofstream out("trie.out");

char sir[25];

struct nod{
	int nrap,nrcuv;
	nod *p[28];
	nod(){
		nrap=nrcuv=0;
		for(int i=0;i<28;i++)
			p[i]=0;
	}
}*root;

void insereaza(){
	int i=0;
	nod *curent;
	curent=root;
	while(sir[i]!=NULL){
		if(curent->p[sir[i]-'a']==NULL){
			curent->p[sir[i]-'a']=new nod();
			curent=curent->p[sir[i]-'a'];
			curent->nrap=1;
			if(sir[i+1]==NULL)
				curent->nrcuv=1;
		}
		else{
			curent=curent->p[sir[i]-'a'];
			curent->nrap++;
			if(sir[i+1]==NULL)
				curent->nrcuv++;
		}
		++i;
	}
}		

/*void sterge(nod *curent,int i){
	nod *copie;
	int poz;
	poz=sir[i]-'a';
	copie=curent;
	curent->nrap--;
	if(sir[i+1]==NULL)
		curent->nrcuv--;
	curent=curent->p[sir[i+1]-'a'];
	if(sir[i+1]!=NULL && curent!=NULL){
		sterge(curent,i+1);
	}
	if(curent->nrap==0){
		copie->p[poz]=NULL;
		delete curent;
	}
}*/

void sterge(){
	int i=0,poz;
	nod *curent,*ant;
	curent=root;
	ant=root;
	while(sir[i]!=NULL && curent!=NULL){
		ant=curent;
		curent=curent->p[sir[i]-'a'];
		poz=sir[i]-'a';
		curent->nrap--;
		if(sir[i+1]==NULL)
			curent->nrcuv--;
		if(curent->nrap==0){
			ant->p[poz]=NULL;
		}
		if(ant->nrap==0 && ant!=root){
			delete ant;
		}
		++i;
	}
	if(curent->nrap==0 && curent!=root)
		delete curent;
}

int aparitii(){
	int i=0;
	nod *curent;
	curent=root;
	while(sir[i]!=NULL){
	
	curent=curent->p[sir[i]-'a'];
		if(curent==NULL){
			out<<"0\n";
			return 0;
		}
		if(sir[i+1]==NULL){
			out<<curent->nrcuv<<"\n";
			return curent->nrcuv;
		}
		++i;
	}
}

void prefix(){
	int i=0;
	nod *curent;
	curent=root;
	while(sir[i]!=NULL){
		curent=curent->p[sir[i]-'a'];			
		if(curent==NULL){
			out<<i<<'\n';
			return;
		}
		++i;	
	}
	out<<i<<'\n';
}

int main(){
	int opcode;
	root=new nod();
	while(in>>opcode){
		in>>sir;
		if(opcode==0)
			insereaza();
		if(opcode==1)
			sterge();
		if(opcode==2)
			aparitii();
		if(opcode==3)
			prefix();
	}
	return 0;
}