Cod sursa(job #430617)

Utilizator borsoszalanBorsos Zalan borsoszalan Data 31 martie 2010 10:48:36
Problema Trie Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include<stdio.h>
#include<string.h>

struct trie
{
	int cnt, nrfii;
	trie *fiu[26];
	trie()
	{
		nrfii=0;
		cnt=0;
		memset(fiu, 0, sizeof(fiu));
	}
};

 trie *t=new trie;
 char s[25];

 void insert(trie *nod, char *aux)
 {
	 int x=(int)*aux-'a';
	 if(*aux=='\n')
	 {
		 nod->cnt++;
	 }
	 else
	 {
		 if(nod->fiu[x]==0)
		 {
			 nod->fiu[x]=new trie;
			 nod->nrfii++;
		 }
		insert(nod->fiu[x], aux+1);
	 }
 }

 int del(trie *nod, char *aux)
 {
	 int x=(int)*aux-'a';
	 if(*aux=='\n')
		 nod->cnt--;
	 else if(del(nod->fiu[x], aux+1)==1)
	 {
		 nod->nrfii--;
		 nod->fiu[x]=0;
	 }
	 if(nod->nrfii==0&&nod!=t&&nod->cnt==0)
	 {
		 delete nod;
		 return 1;
	 }
	 return 0;
 }

 int query(trie *nod, char *aux)
 {
	 int x=(int)*aux-'a';
	 if(*aux=='\n')
		 return nod->cnt;
	 if(nod->fiu[x]!=0)
		 return query(nod->fiu[x], aux+1);
	 return 0;
 }

 int prefix(trie *nod, char *aux, int k)
 {
 	 int x=(int)*aux-'a';
	 if(*aux=='\n'||nod->fiu[x]==0)
		 return k;
	 else return prefix(nod->fiu[x],aux+1,k+1);
 }

int main()
{
	freopen("trie.in", "r", stdin);
	freopen("trie.out", "w", stdout);
	do{
		fgets(s,25,stdin);
		if(s[0]=='0')
			insert(t, s+2);
		else if(s[0]=='1')
			del(t, s+2);
		else if(s[0]=='2')
			printf("%d\n", query(t, s+2));
		else printf("%d\n", prefix(t, s+2, 0));
	}while(!feof(stdin));
	return 0;

}