Cod sursa(job #2331958)

Utilizator isav_costinVlad Costin Andrei isav_costin Data 30 ianuarie 2019 10:56:29
Problema Trie Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 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 )
  {
    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>>cuv )
    switch( op )
    {
      case 0:
        trie=insert(trie,cuv);
      break;

      case 1:
        trie=erase(trie,cuv);
      break;

      case 2:
        fout<<search(trie,cuv)<<endl;
      break;

      case 3:
        fout<<cmlpc(trie,cuv)<<endl;
      break;
    }

  return 0;
}