Cod sursa(job #3213183)

Utilizator Radu_VasileRadu Vasile Radu_Vasile Data 12 martie 2024 17:23:58
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>
#define LIT 26
using namespace std;
struct Trie{
  int cnt, nrfii;
  Trie *fiu[LIT];
  Trie(){
    cnt = nrfii = 0;
    memset(fiu, 0, sizeof(fiu));
  }
};
Trie *T = new Trie;
void ins( Trie *nod, char *s ){
  if(*s == '\n'){
    nod -> cnt++;
    return;
  }
  if(nod -> fiu[*s - 'a'] == 0){
    nod -> fiu[*s - 'a'] = new Trie;
    nod -> nrfii++;
  }
  ins(nod -> fiu[*s - 'a'], s + 1);
}
int del(Trie *nod, char *s){
  if(*s == '\n')
    nod -> cnt--;
  else if(del( nod -> fiu[*s - 'a'], s + 1 )){
    nod -> fiu[*s - 'a'] = 0;
    nod -> nrfii--;
  }
  if( nod -> cnt == 0 && nod -> nrfii == 0 && nod != T){
    delete nod;
    return 1;
  }
  return 0;
}
int que(Trie *nod, char *s){
  if(*s == '\n')
    return nod -> cnt;
  if(nod -> fiu[*s - 'a'])
    return que(nod -> fiu[*s - 'a'], s + 1);
  return 0;
}
int pre(Trie *nod, char *s, int k){
  if(*s == '\n' || nod -> fiu[*s - 'a'] == 0)
    return k;
  return pre(nod -> fiu[*s - 'a'], s + 1, k + 1);
}


int main()
{
    FILE *fin, *fout;
    char str[23];
    fin = fopen("trie.in", "r");
    fout = fopen("trie.out", "w");

    fgets(str, 23, fin);
    while(!feof(fin)){
      if(str[0] == '0')
        ins(T, str  + 2);
      else if(str[0] == '1')
        del(T, str + 2);
      else if(str[0] == '2')
        fprintf(fout, "%d\n", que(T, str + 2));
      else
        fprintf(fout, "%d\n", pre(T, str + 2, 0));
      fgets(str, 23, fin);
    }


    fclose(fin);
    fclose(fout);
    return 0;
}