Cod sursa(job #286041)

Utilizator StigmaSimina Pitur Stigma Data 23 martie 2009 12:57:43
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream.h>
#include <string.h>
ifstream fin("trie.in");
ofstream fout("trie.out");



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


trie *T=new trie;
char c[32],*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))
      {nod->nrfii--;
       nod->fiu[*s-'a']=0;
       }


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.getline(c,32);

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

 fout.close();
return 0;
}