Cod sursa(job #1002741)

Utilizator PavelRazvanPavel Razvan PavelRazvan Data 28 septembrie 2013 17:39:21
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#include <fstream>
#include <vector>
#define DIM 30

using namespace std;

ifstream fin ("trie.in");
ofstream fout ("trie.out");

struct tree_node {

  int son_count, show_count;
  tree_node *tree_son[DIM];

  tree_node() {
    son_count = show_count = 0;
    for(int i = 0; i < DIM; ++i)
      tree_son[i] = NULL;
  }
} *tree[DIM];

void add(string s) {

  if(!tree[s.at(0) - 'a'])
    tree[s.at(0) - 'a'] = new tree_node;

  int i;
  tree_node *node = tree[s.at(0) - 'a'];

  for(i = 1; i < s.size(); ++i) {
    if(!node->tree_son[s.at(i) - 'a']) {
      node->tree_son[s.at(i) - 'a'] = new tree_node;
      ++node->son_count;
    }
    node = node->tree_son[s.at(i) - 'a'];
  }
  ++node->show_count;
}

bool remove(tree_node *node, string s) {

  if(!node)
    return 1;

  if(s.size() == 1) {
    if(--node->show_count == 0 && node->son_count == 0) {
      delete node;
      return 1;
    }
    return 0;
  }

  if(remove(node->tree_son[s.at(1) - 'a'], s.substr(1))) {
    node->tree_son[s.at(1) - 'a'] = NULL;
    if(--node->son_count == 0) {
      delete node;
      return 1;
    }
  }
  return 0;
}

void count(string s) {

  int i;
  tree_node *node = tree[s.at(0) - 'a'];

  if(!node) {
    fout << "0\n";
    return;
  }

  for(i = 1; i < s.size(); ++i) {
    if(node->tree_son[s.at(i) - 'a'])
      node = node->tree_son[s.at(i) - 'a'];
    else {
      fout << "0\n";
      return;
    }
  }

  fout << node->show_count << '\n';
}

void search(string s) {

  int i;
  tree_node *node = tree[s.at(0) - 'a'];

  if(!node) {
    fout << "0\n";
    return;
  }

  for(i = 1; i < s.size(); ++i) {
    if(!node->tree_son[s.at(i) - 'a'])
      break;
    node = node->tree_son[s.at(i) - 'a'];
  }

  fout << i << '\n';
}

int main() {

  string s;

  while(getline(fin, s))
    switch(s[0]) {
      case '0': add(s.substr(2));break;
      case '1':
        if(remove(tree[s.at(2) - 'a'], s.substr(2)))
          tree[s.at(2) - 'a'] = NULL;
        break;
      case '2': count(s.substr(2));break;
      case '3': search(s.substr(2));break;
    }

  fin.close();
  fout.close();
  return 0;
}