Cod sursa(job #2332576)

Utilizator isav_costinVlad Costin Andrei isav_costin Data 30 ianuarie 2019 21:13:46
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
#include <fstream>

#define MAXCH 26

using namespace std;

ifstream fin( "trie.in" );
ofstream fout( "trie.out" );

class Node
{
  public:
    int nrp, nrc;
    Node* fii[MAXCH];

  Node( )
  {
    nrp=nrc=0;

    for( int i=0;i<MAXCH;i++ )
      fii[i]=NULL;
  }
};

Node* insert( Node* node, char* s )
{
  if( node==NULL )
    node=new Node;

  node->nrp++;

  if( s[0]=='\0' )
    node->nrc++;
  else
    node->fii[s[0]-'a']=insert(node->fii[s[0]-'a'],s+1);

  return node;
}

Node* erase( Node* node, char* s )
{
  node->nrp--;

  if( s[0]=='\0' )
    node->nrc--;
  else
    node->fii[s[0]-'a']=erase(node->fii[s[0]-'a'],s+1);

  if( node->nrp==0 )
  {
    delete(node);
    node=NULL;
  }

  return node;
}

int search( Node* node, char* s )
{
  if( node==NULL )
    return 0;

  if( s[0]=='\0' )
    return node->nrc;
  else
    return search(node->fii[s[0]-'a'],s+1);
}

int cmlpc( Node* node, char* s )
{
  if( node==NULL )
    return -1;

  if( s[0]=='\0' )
    return 0;
  else
    return 1+cmlpc(node->fii[s[0]-'a'],s+1);
}

int main()
{
  int op;
  char cuv[MAXCH];

  Node* trie=NULL;

  while( fin>>op )
  {
    fin>>cuv;

    if( op==0 )
      trie=insert(trie,cuv);
    else if( op==1 )
      trie=erase(trie,cuv);
    else if( op==2 )
      fout<<search(trie,cuv)<<'\n';
    else
      fout<<cmlpc(trie,cuv)<<'\n';
  }

  return 0;
}