Cod sursa(job #2030340)

Utilizator CodrinsahCotarlan Codrin Codrinsah Data 1 octombrie 2017 14:39:59
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#define lit sir[poz]-'a'
using namespace std;
ifstream fi ("trie.in");
ofstream fo ("trie.out");
struct nod
{
  int cuv,nrfii;
  nod *urm[26];
  nod()
  {
    cuv=0;
    nrfii=0;
    for (int i=0;i<26;i++) urm[i]=NULL;
  }
};
nod *cap;

string sir;
int op;

void adaug(nod *&curent,int poz)
{
  if (curent==NULL) curent=new nod;
  if (poz==sir.size())
  {
    curent -> cuv++;
  }
  else
  {
    curent -> nrfii++;
    adaug(curent->urm[lit],poz+1);
  }
}

void sterg(nod *&curent,int poz)
{
  if (poz==sir.size())
    curent -> cuv--;
  else
  {
    curent -> nrfii--;
    sterg(curent -> urm[lit],poz+1);
  }
}
int aparitii(nod *&curent,int poz)
{
  if (curent==NULL) return 0;
  if (poz==sir.size()) return curent -> cuv;
  else return aparitii(curent -> urm[lit],poz+1);
}
int lgprefix(nod *&curent,int poz)
{
  if (curent -> urm[lit]==NULL) return poz;
  if (poz==sir.size()) return poz;
  if (curent ->urm[lit] -> nrfii>0 or curent -> urm[lit] -> cuv>0) return lgprefix(curent->urm[lit],poz+1);
  return poz;
}
int main()
{
  cap=new nod;
  while (fi>>op)
  {
    fi>>sir;
    if (op==0) adaug(cap,0);
    if (op==1) sterg(cap,0);
    if (op==2) fo<<aparitii(cap,0)<<'\n';
    if (op==3) fo<<lgprefix(cap,0)<<'\n';
  }
  return 0;
}