Cod sursa(job #2266542)

Utilizator andrei_diaconu11Andrei C. Diaconu andrei_diaconu11 Data 22 octombrie 2018 19:15:28
Problema Trie Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <bits/stdc++.h>

using namespace std;

string s;

map <int,map <char,int>> ad;
map <int,int> nr, tat;
int ct = 1;

inline bool nu_exista_fiu(int nod, char ch){
  return ad[nod][ch] == 0 || tat[ad[nod][ch]] != nod;
}

int get_nod(){
  int nod = 0;
  for(auto ch : s){
    if(nu_exista_fiu(nod, ch)){
      ad[nod][ch] = ct;
      tat[ct++] = nod;
    }
    nod = ad[nod][ch];
  }
  return nod;
}

void sterge(int nod){
  if(ad[nod].size() != 0)
    return;
  int nodp = nod;
  while(nod != 0 && ad[nod].size() <= 1){
    ad.erase(nod);
    nodp = nod;
    nod = tat[nod];
    tat.erase(nodp);
    nr.erase(nodp);
  }
}

pair<int,int> query(){
  int nod = 0;
  for(int i = 0; i < s.size(); i++){
    if(nu_exista_fiu(nod, s[i]))
      return {0, i};
    nod = ad[nod][s[i]];
  }
  return {nr[nod], s.size()};
}

ifstream fi("trie.in");
ofstream fo("trie.out");

int main()
{
  int op, nod;
  fi >> op >> s;
  while(!fi.eof()){
    if(op == 0){
      nod = get_nod();
      nr[nod]++;
    }
    else if(op == 1){
      nod = get_nod();
      nr[nod]--;
      if(nr[nod] == 0)
        sterge(nod);
    }
    else if(op == 2)
      fo << query().first << '\n';
    else
      fo << query().second << '\n';
    fi >> op >> s;
  }
  fi.close();
  fo.close();
  return 0;
}