Cod sursa(job #2974444)

Utilizator georgerapeanuRapeanu George georgerapeanu Data 4 februarie 2023 09:32:22
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.08 kb
#include <bits/stdc++.h>

using namespace std;

const int SIGMA = 'z' - 'a' + 1;

struct trie_node_t {
  int end_count; // numarul de cuvinte care se termina in nodul curent
  int passing_count; // numarul de cuvinte care trec prin nodul asta
  trie_node_t* sons[SIGMA]; 

  trie_node_t() {
    end_count = 0;
    passing_count = 0;
    memset(sons, 0, sizeof(sons));// face fiecare son sa fie = NULL
  }
};


// noi vrem incepand in nodul root sa inseram stringul s incepand de la pozitia pos
void insert(trie_node_t* root, const string &s, int pos){
    root->passing_count += 1;
    
    if(pos >= (int)s.size()) {
      root->end_count += 1;
      return ;
    }

    int son_index = s[pos] - 'a';

    if(root->sons[son_index] == NULL){
      root->sons[son_index] = new trie_node_t();
    }

    insert(root->sons[son_index], s, pos + 1);
}

void remove(trie_node_t* root, const string &s, int pos){
    root->passing_count -= 1;
    
    if(pos >= (int)s.size()) {
      root->end_count -= 1;
      return ;
    }

    int son_index = s[pos] - 'a';

    remove(root->sons[son_index], s, pos + 1);
}

int get_frequency(trie_node_t* root, const string &s, int pos) {
  if(pos >= (int)s.size()){
    return root->end_count;
  }

  int son_index = s[pos] - 'a';

  if(root->sons[son_index] == NULL){
    return 0;
  }

  return get_frequency(root->sons[son_index], s, pos + 1);
}

int get_lcp(trie_node_t* root, const string &s, int pos){
  if(pos >= (int)s.size()) {
    return 0;
  }

  int son_index = s[pos] - 'a';
  
  if(root->sons[son_index] == NULL || root->sons[son_index]->passing_count == 0){
    return 0;
  }

  return 1 + get_lcp(root->sons[son_index], s, pos + 1);

}


int main() {
  ifstream f("trie.in");  
  ofstream g("trie.out");  
  
  int op;
  string s;

  trie_node_t* root = new trie_node_t();

  while(f >> op >> s) {
    if(op == 0) {
      insert(root, s, 0);    
    } else if (op == 1) {
      remove(root, s, 0); 
    } else if(op == 2) {
      g << get_frequency(root, s, 0) << "\n"; 
    } else {
      g << get_lcp(root, s, 0) << "\n";
    }
  }

  f.close();
  g.close();
  return 0;
}