Cod sursa(job #283635)

Utilizator StigmaSimina Pitur Stigma Data 19 martie 2009 14:32:05
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream.h>
#include <string.h>
ifstream fin("trie.in");
ofstream fout("trie.out");

const char key[]="0123";


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


trie *T=new trie;
char c[50],*cuv;



void insert(trie *nod, char *s)
{if (*s==0)
 {nod->nrcuv++;
  return;
  }

 if (nod->fiu[*s-'a']==0)
  {nod->nrfii++;
   nod->fiu[*s-'a']=new trie;
   }

 insert(nod->fiu[*s-'a'],s+1);

}



int cut(trie *nod, char *s)
{if (*s==0)
  nod->nrcuv--;
   else
    if (cut(nod->fiu[*s-'a'], s+1))
      delete nod;


  if (nod->nrfii==0 && nod->nrcuv==0 && nod!=T)
   {delete nod;return 1;}

return 0;
}




int aparitii(trie *nod, char *s)
{if (*s==0) return nod->nrcuv;
 if (nod->fiu[*s-'a'])
  return aparitii(nod->fiu[*s-'a'], s+1);
 return 0;
}


int prefix(trie *nod, char *s)
{if (*s!=0)
 if (nod->fiu[*s-'a'])
  return 1+prefix(nod->fiu[*s-'a'], s+1);

return 0;
}





int main()
{fin.get(c,50,'\n');

 while (c[0]=='0' || c[0]=='1'|| c[0]=='2'|| c[0]=='3')
  {cuv=c;
   if (cuv[0]=='0') insert(T,cuv+2);
   if (cuv[0]=='1') cut(T,cuv+2);
   if (cuv[0]=='2') fout<<aparitii(T,cuv+2)<<'\n';
   if (cuv[0]=='3') fout<<prefix(T,cuv+2)<<'\n';
   fin.get();
   fin.get(c,50,'\n');
   }

 fout.close();
return 0;
}