Cod sursa(job #2307393)

Utilizator Lazar_LaurentiuLazar Laurentiu Lazar_Laurentiu Data 24 decembrie 2018 14:59:49
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <fstream>

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 < (int)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 < (int)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 < (int)cv.size(); i++ )
    nda = nda -> fiu[ cv[i] - 'a' ];
  
  return nda -> val;
}

int sufxmaxcom(string cv){
  int i, ansa = 0;
  nod *nda;
  
  for( i = 0, nda = n0; i < (int)cv.size(); i++ ){
    if( nda -> fiu[ cv[i] - 'a' ] == 0 )
      break;
    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 << sufxmaxcom( s ) << '\n';
    }
    f.close ();
    g.close ();
    return 0;
}