Cod sursa(job #2266673)

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

using namespace std;

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

trie *T = new trie;
char *capat;

void ins(trie *nod, char *it){
  if(it != capat){
    if(nod->fiu[*it] == 0){
      nod->nrf++;
      nod->fiu[*it] = new trie;
    }
    ins(nod->fiu[*it], it + 1);
  }
  else
    nod->nr++;
}

int flag;
void del(trie *nod, char *it){//0 - inca taiem. 1 - nu mai taiem
  if(it == capat){
    nod->nr--;
    if(nod->nr == 0 && nod->nrf == 0)
      flag = 0;
    else
      flag = 1;
    return;
  }
  del(nod->fiu[*it], it + 1);
  if(flag == 0){
    delete nod->fiu[*it];
    nod->nrf--;
    nod->fiu[*it] = 0;
    if(!(nod->nr == 0 && nod->nrf == 0))
      flag = 1;
  }
}

int get_occ(trie *nod, char *it){
  if(it != capat){
    if(nod->fiu[*it] == 0)
      return 0;
    return get_occ(nod->fiu[*it], it + 1);
  }
  return nod->nr;
}

int get_pref(trie *nod, char *it, int niv){
  if(it != capat){
    if(nod->fiu[*it] == 0)
      return niv;
    return get_pref(nod->fiu[*it], it + 1, niv + 1);
  }
  return niv;
}

char s[21];

int main()
{
  FILE *fi = fopen("trie.in", "r"), *fo = fopen("trie.out", "w");
  int op;
  while(fscanf(fi, "%d%s", &op, s) != EOF){
    capat = s + strlen(s);
    for(char *i = s; i != capat; i++)
      *i -= 'a';
    if(op == 0)
      ins(T, s);
    else if(op == 1)
      del(T, s);
    else if(op == 2)
      fprintf(fo, "%d\n", get_occ(T, s));
    else
      fprintf(fo, "%d\n", get_pref(T, s, 0));
  }
  fclose(fi);
  fclose(fo);
  return 0;
}