Cod sursa(job #2307374)

Utilizator Lazar_LaurentiuLazar Laurentiu Lazar_Laurentiu Data 24 decembrie 2018 14:30:38
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <iomanip>
#include <fstream>
#define MAX 2000010
#define x first
#define y second

using namespace std;
struct nod{
  nod *fiu[('z'-'a'+1)];
  int val;
  int nrt;
};
nod *creeaza_nod(){
  nod *na = new nod;
  na->val=0; na->nrt=0;
  for(int i='a';i<='z';i++) na->fiu[i-'a']=0;
  return na;
}

int o;
nod *n0=creeaza_nod();
string s;
void adauga(string cv){
  int i;
  nod *nda;
  for(i=0,nda=n0;i<cv.size();i++){
    nda->nrt++;
    if(nda->fiu[cv[i]-'a']==0)
      nda->fiu[cv[i]-'a']=creeaza_nod();
    nda=nda->fiu[cv[i]-'a'];
  }
  nda->nrt++;
  (nda->val)++;
}
void sterge(string cv){
  int i;
  nod *nda;
  for(i=0,nda=n0;i<cv.size();i++){
    nda->nrt--;
    nda=nda->fiu[cv[i]-'a'];
  }
  nda->nrt--;
  (nda->val)--;
}
int nraparitii(string cv){
  int i;
  nod *nda;
  for(i=0,nda=n0;i<cv.size();i++) nda=nda->fiu[cv[i]-'a'];
  return (nda->val);
}
int sufmaxcom(string cv){
  int i,ansa=0;
  nod *nda;
  for(i=0,nda=n0;i<cv.size();i++){
    if(nda->fiu[cv[i]-'a']==0)
      nda->fiu[cv[i]-'a']=creeaza_nod();
    nda=nda->fiu[cv[i]-'a'];
    if((nda->nrt)!=0)ansa=i+1;
  }
  return ansa;
}

int main()
{
    ifstream f ("trie.in");
    ofstream g ("trie.out");
    while(f>>o){
      f>>s;
      if(o==0)adauga(s);
      if(o==1)sterge(s);
      if(o==2)g<<nraparitii(s)<<'\n';
      if(o==3)g<<sufmaxcom(s)<<'\n';
    }
    f.close ();
    g.close ();
    return 0;
}