Cod sursa(job #243525)

Utilizator Sorin_IonutBYSorynyos Sorin_Ionut Data 13 ianuarie 2009 15:41:16
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <stdio.h>

#define IN "trie.in"
#define OUT "trie.out"

FILE *fin=fopen(IN,"r");
FILE *fout=fopen(OUT,"w");

struct nod
{
 int val;
 nod *l[30];
};
nod *trie;

void add(char *s);
void del(char *s);
void init(nod *q);
int search(char *s);
int pref(char *s);

int main()
{
 int op;
 char cuv[30];

 init(trie);

 while(!feof(fin))
 {
  fscanf(fin,"%d",&op);
  fscanf(fin,"%s",&cuv);

  if(op==0)
   add(cuv);
  else
   if(op==1)
    del(cuv);
   else
    if(op==2)
     fprintf(fout,"%d\n",search(cuv));
    else
     if(op==3)
      fprintf(fout,"%d\n",pref(cuv));
 }

 fclose(fin);
 fclose(fout);

return 0;
}

void add(char *s)
{
 nod *p,*q=trie;
 int i;
 int transf;

 for(i=0;s[i];i++)
 {
  transf=s[i]-96;

  if(q->l[transf])
   q=q->l[transf];
  else
  {
   p=new nod;
   init(p);
   q->l[transf]=p;
   q=p;
  }
 }
 q->val++;
}

void del(char *s)
{
 nod *q=trie;
 int i,j;
 int transf;
 int ult;

 for(i=0;s[i];i++)
 {
  transf=s[i]-96;

  for(j=1;j<=28;j++)
   if(q->l[j] && j!=transf)
    ult=i;

  if(q->l[transf])
   q=q->l[transf];
 }

 if(q->val)
 {
  q->val--;
  return;
 }

 q=trie;
 for(i=0;(s[i] && i!=ult);i++)
 {
  transf=s[i]-96;

  if(q->l[transf])
   q=q->l[transf];
 }
 transf=s[i]-96;
 q->l[transf]=NULL;
 
}

int search(char *s)
{
 nod *q=trie;
 int i;
 int transf;

 for(i=0;s[i];i++)
 {
  transf=s[i]-96;

  if(q->l[transf])
   q=q->l[transf];
  else
   break;
 }

 if(s[i])
  return 0;

return q->val;
}

int pref(char *s)
{
 nod *q=trie;
 int i;
 int transf;
 int sol=0;

 for(i=0;s[i];i++)
 {
  transf=s[i]-96;

  if(q->l[transf])
  {
   sol=i+1;
   q=q->l[transf];
  }
  else
   break;
 }
return sol;
}

void init(nod *q)
{
 int i;

 q->val=0;

 for(i=1;i<=28;i++)
  q->l[i]=NULL;
}