Cod sursa(job #302829)

Utilizator rethosPaicu Alexandru rethos Data 9 aprilie 2009 12:24:40
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <stdio.h>
#include <string.h>
#define LM 21
char w[LM];
int n;
int alfa;
struct trie{int nr,fii;
		    trie *urm[26];
			trie()
				{nr=fii=0;
				 for (int i=0;i<26;i++) urm[i]=NULL;
				}
		    };
trie *r=new trie;			
void add(trie*,int);
int del(trie*,int);
int nrap(trie*,int);
int pref(trie*,int);
int main()
{freopen("trie.in","r",stdin);
 freopen("trie.out","w",stdout);
 int i;
 for (i=0;i<26;i++) r->urm[i]=NULL;
 while (!feof(stdin))
	 {scanf("%d %s\n",&i,w);
	  n=strlen(w);
	  switch(i)
		  {case 0: add(r,0);break;
		   case 1: del(r,0);break;
		   case 2: printf("%d\n",nrap(r,0));break;
		   case 3: printf("%d\n",pref(r,0));break;
		  }	 
      if (alfa==57984) 
		  {i=i;
		   i=i;		   
		   n=i;
		  }
	  alfa++;
	 }
 return 0;	 
}
/********/
void add(trie *p,int i)
{if (i==n) 
	{p->nr++;
	 return;
	}
 if (p->urm[w[i]-'a']==NULL)
	 {p->urm[w[i]-'a']=new trie;
	  p->fii++;
	 }
 add(p->urm[w[i]-'a'],i+1);
}
int del(trie *p,int i)
{if (i==n)
	{p->nr--;
	 if (p->fii==0&&p->nr==0) 
		 {delete p;
		  return 1;
		 }
	 return 0;
	}
 if (del(p->urm[w[i]-'a'],i+1)) 
	 {p->fii--;
	  p->urm[w[i]-'a']=NULL;
     }
 if (p->nr==0&&p->fii==0&&p!=r) 
	 {delete p;
	  return 1;
	 }
 return 0;	 
} 
int nrap(trie *p,int i)
{if (i==n) return p->nr;
 if (p->urm[w[i]-'a']==NULL) return 0;
 return nrap(p->urm[w[i]-'a'],i+1);	 
}
int pref(trie *p,int i)
{if (i==n) return n;
 if (p->urm[w[i]-'a']==NULL)
	 return i;
 return pref(p->urm[w[i]-'a'],i+1);	 
}