Cod sursa(job #1378661)

Utilizator StefanMudragMudrag Stefan StefanMudrag Data 6 martie 2015 13:31:55
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include<iostream>
#include<fstream>
#include<cstring>
#include<algorithm>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
    int pr,cv;
    Trie *urm[26];
    Trie()
    {
        pr=cv=0;
        memset(urm,0,sizeof(urm));
    }
};
Trie *R=new Trie();
void add(Trie *t,char *s)
{
      ++t->pr;
      if(*s==0)
      {
          ++t->cv;
          return;
      }
      if(t->urm[*s-'a']==0)
        t->urm[*s-'a']=new Trie();
    add(t->urm[*s-'a'],s+1);
}
void sterg(Trie *t,char *s)
{
    --t->pr;
    if(*s==0)
    {
       --t->cv;
        return;
    }
sterg(t->urm[*s-'a'],s+1);
}
int cuvinte(Trie *t,char *s)
{
    if(*s==0)
    {
        return t->cv;
    }
    if(t->urm[*s-'a']==0)return 0;

    return cuvinte(t->urm[*s-'a'],s+1);

}
int pref(Trie *t,char *s)

{
      if(t->pr==0)
        return 0;
        if(*s==0)return 1;
      if(t->urm[*s-'a']==0)
        return 1;
      return 1+pref(t->urm[*s-'a'],s+1);
}
int main()
{
    int tip;
    while(fin>>tip)
    {
        char aux[24];
        fin>>aux;
        if(tip==0)
        {

            add(R,aux);
        }
        else
            if(tip==1)
        {
            sterg(R,aux);
        }
        else
            if(tip==2)
            fout<<cuvinte(R,aux)<<'\n';
        else
            if(tip==3)
        {
            fout<<max(0,pref(R,aux)-1)<<'\n';
        }
    }
    fin.close();
    fout.close();
    return 0;
}