Cod sursa(job #2266614)

Utilizator andrei_diaconu11Andrei C. Diaconu andrei_diaconu11 Data 22 octombrie 2018 20:03:31
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>

using namespace std;

string s;

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

struct trie{
  int nr, nrf;
  trie *fiu[26];
  trie(){
    nr = nrf = 0;
    memset(fiu, 0, sizeof(fiu));
  }
};

trie *T = new trie;

void ins(trie *nod, string::iterator it){
  if(it != s.end()){
    if(nod->fiu[*it] == 0){
      nod->nrf++;
      nod->fiu[*it] = new trie;
    }
    ins(nod->fiu[*it], it + 1);
  }
  else
    nod->nr++;
}

int del(trie *nod, string::iterator it){//0 - inca taiem. 1 - nu mai taiem
  if(it == s.end()){
    nod->nr--;
    if(nod->nr == 0 && nod->nrf == 0)
      return 0;
    return 1;
  }
  int aux = del(nod->fiu[*it], it + 1);
  if(aux == 0){
    delete nod->fiu[*it];
    nod->nrf--;
    nod->fiu[*it] = 0;
    if(nod->nr == 0 && nod->nrf == 0)
      return 0;
  }
  return 1;
}

int get_occ(trie *nod, string::iterator it){
  if(it != s.end()){
    if(nod->fiu[*it] == 0)
      return 0;
    return get_occ(nod->fiu[*it], it + 1);
  }
  return nod->nr;
}

int get_pref(trie *nod, string::iterator it, int niv){
  if(it != s.end()){
    if(nod->fiu[*it] == 0)
      return niv;
    return get_pref(nod->fiu[*it], it + 1, niv + 1);
  }
  return niv;
}

int main()
{
  int op;
  fi >> op >> s;
  while(!fi.eof()){
    for(int i = 0; i < s.size(); i++)
      s[i] -= 'a';
    if(op == 0)
      ins(T, s.begin());
    else if(op == 1)
      del(T, s.begin());
    else if(op == 2)
      fo << get_occ(T, s.begin()) << '\n';
    else
      fo << get_pref(T, s.begin(), 0) << '\n';
    fi >> op >> s;
  }
  fi.close();
  fo.close();
  return 0;
}