Cod sursa(job #2183633)

Utilizator alex.info99polimernic alex.info99 Data 23 martie 2018 12:09:55
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<bits/stdc++.h>
using namespace std;
struct trie{
	int cnt, nf;
	trie* fiu[27];
	trie(){
		cnt=nf=0;
		memset(fiu, 0, sizeof(fiu));
	}
};
trie *t=new trie;
string y;
void add(trie *nod, int i){
	if(y[i]=='\n'){
		nod->cnt ++;
		return;
	}
	if(nod->fiu[y[i]-'a']==0){
		nod->fiu[y[i]-'a']=new trie;
		nod->nf ++;
	}
	add(nod->fiu[y[i]-'a'], i+1);
}
int del(trie *nod, int i){
	if(y[i]=='\n'){
		nod->cnt--;
	}else if(del(nod->fiu[y[i]-'a'], i+1)){
		nod->fiu[y[i]-'a']=0;
		nod->nf--;
	}
	if(nod->cnt==0 && nod!=t && nod->nf==0){
		delete nod;
		return 1;
	}
	return 0;
}
int que(trie *nod, int i){
	if(y[i]=='\n'){
		return nod->cnt;
	}
	if(nod->fiu[y[i]-'a'])return que(nod->fiu[y[i]-'a'],i+1);
	return 0; 
}
int pre(trie *nod, int i){
	if(y[i]=='\n' || nod->fiu[y[i]-'a']==0){
		return i;
	}
	return pre(nod->fiu[y[i]-'a'], i+1);
}
int main(){
	ifstream f("trie.in");
	ofstream g("trie.out");
	int x;
	while(f>>x>>y){
		y+='\n';
		if(x==0){
			add(t, 0);continue;
		}
		if(x==1){
			del(t, 0);continue;
		}
		if(x==2){
			g<<que(t,0)<<'\n'; continue;
		}
		g<<pre(t,0)<<'\n';
	}
}