Cod sursa(job #717555)

Utilizator mr.johnFMI - Laceanu Ionut-Adrian mr.john Data 19 martie 2012 23:45:24
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <cstring>
#include <stdio.h>

using namespace std;

struct nod{
	nod *v[26];
	int fii;
	int nr;
	nod(){
		fii=nr=0;
		memset(v,0,sizeof(v) );
	}
};

nod *T=new nod;

void adaug(nod *t,char s[21],int i){
	if(i==strlen(s)){
		t->nr++;
		return;
	}
	if(t->v[s[i]-'a']==0){
		t->v[s[i]-'a']=new nod;
		t->fii++;
	}
	adaug(t->v[s[i]-'a'],s,i+1);
}

int del(nod *t,char s[21],int i){
	if (i==strlen(s))
		t->nr--;
	else 
		if (del(t->v[s[i]-'a'],s,i+1)){
			t->v[s[i]-'a']=0;
			t->fii--;
		}
	if (!t->nr && !t->fii && t!=T){
		delete t; return 1;
	}
	return 0;
}

int query(nod *t, char s[21],int i){
	if (i==strlen(s))
		return t->nr;
	if (t->v[s[i]-'a'])
		return query(t->v[s[i]-'a'],s,i+1);
	return 0;
}	
int prefix(nod *t,char s[21],int i){
	if (i==strlen(s) || !t->v[s[i]-'a'])
		return i;
	return prefix(t->v[s[i]-'a'],s,i+1);
}

int main ()
{
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
	int op;
	char c[21];
	while( scanf("%d %s", &op, &c) != EOF){
		if (op==0) adaug(T,c,0);
		else if (op==1) del(T,c,0);
		else if (op==2) printf("%d\n",query(T,c,0));
		else if (op==3) printf("%d\n",prefix(T,c,0));
	}
	return 0;
}