Cod sursa(job #641513)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 28 noiembrie 2011 17:57:51
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include<fstream>
using namespace std;
struct trie{int inf,nrf;
			trie* fiu[26];
			};
trie *T=new trie;
void set_new_trie(trie *nod) {
	nod->inf=nod->nrf=0;
	for(int i=0;i<26;nod->fiu[i++]=0);
}
int prefix(trie *nod,char *p) {
	int k=0;
	while(*p) {
		if(nod->fiu[*p-'a']) {
			nod=nod->fiu[*p-'a'];
			p++;
			}
		else
			break;
		k++;
		}
	return k;
}
int count(trie *nod,char *p) {
	while(*p) {
		if(nod->fiu[*p-'a']) {
			nod=nod->fiu[*p-'a'];
			p++;
			}
		else
			return 0;
		}
	return nod->inf;
}
void del(trie *nod,char *p) {
	if(!*p)
		nod->inf--;
	else {
		del(nod->fiu[*p-'a'],p+1);
		if(nod->fiu[*p-'a']->inf==0&&nod->fiu[*p-'a']->nrf==0&&nod->fiu[*p-'a']!=T) {
			delete nod->fiu[*p-'a'];
			nod->fiu[*p-'a']=0;
			nod->nrf--;
			}
		}
}
void add(trie *nod,char *p) {
	while(*p) {
		if(nod->fiu[*p-'a']==0) {
			nod->fiu[*p-'a']=new trie;
			set_new_trie(nod->fiu[*p-'a']);
			nod->nrf++;
			}
		nod=nod->fiu[*p-'a'];
		p++;
		}
	nod->inf++;
}
int main() {
	char line[25]="55";
	set_new_trie(T);
	ifstream in("trie.in");
	ofstream out("trie.out");
	while(!in.eof()) {
		switch(line[0]) {
			case '0':add(T,line+2);break;
			case '1':del(T,line+2);break;
			case '2':out<<count(T,line+2)<<'\n';break;
			case '3':out<<prefix(T,line+2)<<'\n';break;
			}
		in.getline(line,24);
		}
	in.close();
	out.close();
	return 0;
}