Cod sursa(job #2255062)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 6 octombrie 2018 13:09:09
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.32 kb
#include <bits/stdc++.h>
#define maxl 20

using namespace std;

typedef struct
{
  int val, mask, next[26], prev;
}trie;

char v[maxl+5];
vector <trie> arb;
vector <int> qu; /// queue cu elemente sterse
int lo, hi;

int get_new_adr ()
{
  int adr;
  if ( lo < hi )
  {
    adr = qu[lo];
    lo++;
  }
  else
  {
    adr = arb.size ();
    arb.push_back ( trie() );
  }

  arb[adr].mask = arb[adr].prev = arb[adr].val = 0;
  for ( int i = 0; i < 26; i++ )
    arb[adr].next[i] = 0;

  return adr;
}

void del_nod ( int adr )
{
  qu.push_back ( adr );
  hi++;
}

void add_cuv ( int sl )
{
  int cur = 0, i = 0;

  i = 0;
  while ( i < sl && (arb[cur].mask & (1<<v[i])) > 0 )
  {
    cur = arb[cur].next[v[i]];
    i++;
  }

  if ( i == sl )
  {
    arb[cur].val++;
    return;
  }
  int adr;
  for ( ; i < sl; i++ )
  {
    arb[cur].mask += (1<<v[i]);
    adr = get_new_adr ();
    arb[cur].next[v[i]] = adr;
    arb[adr].prev = cur;
    cur = adr;
  }

  arb[cur].val++;
}

void del_cuv ( int sl )
{
  int cur = 0, i = 0;
  for ( i = 0; i < sl; i++ )
    cur = arb[cur].next[v[i]];

  arb[cur].val--;
  if ( arb[cur].val == 0 && arb[cur].mask == 0 )
  {
    del_nod ( cur );
    cur = arb[cur].prev;
    i = sl - 1;
    while ( i >= 0 && cur != 0 && arb[cur].mask == (1<<v[i]) && arb[cur].val == 0 )
    {
      del_nod ( cur );
      i--;
      cur = arb[cur].prev;
    }

    if ( cur != 0 )
      arb[cur].mask -= (1<<v[i]);
  }
}

int num_cuv ( int pin, int sl )
{
  int cur = 0, i = 0;

  while ( i < sl && (arb[cur].mask & (1<<v[i])) > 0 )
  {
    cur = arb[cur].next[v[i]];
    i++;
  }

  int rez = 0;
  if ( pin == 0 )
  {
    if ( i == sl )
      rez = arb[cur].val;
    return rez;
  }
  return i;
}

int main ()
{
  int op, sl, i;

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

  arb.push_back ( trie() );
  fin >> op >> v;
  while ( !fin.eof () )
  {
    sl = strlen ( v );
    for ( i = 0; i < sl; i++ )
      v[i] -= 'a';

    if ( op == 0 )
      add_cuv ( sl );
    else if ( op == 1 )
      del_cuv ( sl );
    else if ( op == 2 )
      fout << num_cuv ( 0, sl ) << '\n';
    else
      fout << num_cuv ( 1, sl ) << '\n';
    fin >> op >> v;
  }

  fin.close ();
  fout.close ();

  return 0;
}