Cod sursa(job #825837)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 29 noiembrie 2012 18:22:45
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<fstream>
#include<string.h>
using namespace std;

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

struct trie{
	int nr;
	int nf;
	trie *f[26];
	trie(){
		nr=0;
		nf=0;
		for(int i=0;i<26;i++)
			f[i]=0;
	}
}*r,*p,*c;

int op,val,ok,lungime;
unsigned int i;
char cuv[24];

int main(){
	r=new trie;
	
	while(f>>op){
		f>>cuv;
		if(op==0){
			p=r;
			for(i=0;i<strlen(cuv);i++){
				val=cuv[i]-'a';
				if(p->f[val]!=0)
					p=p->f[val];
				else{
					c=new trie;
					p->f[val]=c;
					p->nf++;
					p=c;
				}
			}
			p->nr++;
		}
		else{
			if(op==1){
				p=r;
				for(i=0;i<strlen(cuv);i++){
					val=cuv[i]-'a';
					c=p;
					p=p->f[val];
				}
				p->nr--;
				if(p->nr==0&&p->nf==0){
					c->f[val]=0;
					delete c->f[val];
				}
			}
			else{
				if(op==2){
					p=r;ok=1;
					for(i=0;i<strlen(cuv);i++){
						val=cuv[i]-'a';
						if(p->f[val]!=0)
							p=p->f[val];
						else{
							ok=0;
							break;
						}
					}
					if(ok)
						g<<p->nr<<"\n";
					else
						g<<"0\n";
				}
				else{
					p=r;
					for(i=0;i<strlen(cuv);i++){
						val=cuv[i]-'a';
						if(p->nf>0||p->nr>0)
							lungime=i;
						if(p->f[val]!=0)
							p=p->f[val];
						else
							break;
					}
					g<<lungime+1<<"\n";
				}
			}
		}
	}
	
	
	return 0;
}