Cod sursa(job #2024040)

Utilizator mariakKapros Maria mariak Data 19 septembrie 2017 20:51:42
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>

FILE *fin = freopen("trie.in", "r", stdin);
FILE *fout = freopen("trie.out", "w", stdout);
using namespace std;

const int SIGMA = 27;

struct Node{
  int app_w, app_p;
  Node *son[SIGMA];
};

Node *new_empty_node(){
  Node *node = new Node;
  node->app_w = node->app_p = 0;
  for(int i = 0; i < SIGMA; ++i) node->son[i] = NULL;
}

void insert (Node *node, char *w){
  if(*w == 0){
    node->app_w ++;
    return;
  }
  if(node->son[*w - 'a'] == NULL)
    node->son[*w - 'a'] = new_empty_node();
  node = node->son[*w - 'a'];
  node->app_p ++;
  insert(node, w + 1);
}

void erase(Node *node, char *w){
  if(*w == 0){
    --node->app_w;
    return;
  }
  node = node->son[*w - 'a'];
  if(node->app_p > 0)
    node->app_p --;
  erase(node, w + 1);
}

int nr_app(Node *node, char *w){
  if(*w == 0)
    return node->app_w;
  if(node->son[*w - 'a'] == NULL) return 0;
  nr_app(node->son[*w - 'a'], w + 1);
}

int pref_lenght(Node *node, char *w, int depth){
  if(*w == 0)
    return depth;
  node = node->son[*w - 'a'];
  if(node != NULL && node->app_p > 0)
     pref_lenght(node, w + 1, depth + 1);
  else return depth;
}

int main(){
  Node *root = new_empty_node();
  int c;
  char word[SIGMA];
  while(scanf("%d ", &c) != EOF){
    gets(word);
    if(c == 0)
        insert(root, word);
    if(c == 1)
        erase(root, word);
    if(c == 2)
        printf("%d\n", nr_app(root, word));
    if(c == 3)
        printf("%d\n", pref_lenght(root, word, 0));
  }
    return 0;
}