Cod sursa(job #1654747)

Utilizator RadduFMI Dinu Radu Raddu Data 17 martie 2016 14:07:05
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");

struct trie
{ int ap,fin;
  trie *son[28];

  trie()
  { ap=fin=0;
    for(int i=1;i<=27;i++)
     son[i]=NULL;
  }
};

trie *rad,*act;

void Change(char s[25],int val)
{ int i,num,len=strlen(s);
  act=rad;

  for(i=0;i<len;i++)
  { num=s[i]-96;

    if (act->son[num]!=NULL)
      { act=act->son[num];
        act->ap+=val;
      }
     else
      { act->son[num]=new trie;
        act=act->son[num];
      }

     act->ap+=val;
  }
  act->fin+=val;
}

void Search(char s[25])
{ int i,num,len=strlen(s),res;
  act=rad;

  for(i=0;i<len;i++)
  { num=s[i]-96;

    if (act->son[num]!=NULL)
       act=act->son[num];
     else return;
  }

  g<<act->fin<<"\n";
}

void Prefix(char s[25])
{ int i,num,len=strlen(s),res;
  act=rad;

  for(i=0;i<len;i++)
  { num=s[i]-96;

    if (act->son[num]!=NULL && (act->son[num])->ap>0)
       act=act->son[num];
     else { g<<i<<"\n"; return;}
  }

  g<<len<<"\n";
}
int main()
{ int t; char sir[25];
    rad=new trie;

    while(!f.eof())
    { f>>t>>sir;
      if (f.eof()) break;
      if (!t) Change(sir,1);
      if (t==1) Change(sir,-1);
      if (t==2) Search(sir);
      if (t==3) Prefix(sir);
    }

    return 0;
}