Cod sursa(job #1013370)

Utilizator PavelRazvanPavel Razvan PavelRazvan Data 20 octombrie 2013 20:31:21
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <fstream>
#include <vector>
#include <cstring>
#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;
    memset(tree_son, 0, sizeof(tree_son));
  }
} *tree = new tree_node;

void add(string s) {

  int i;
  tree_node *node = tree;

  for(i = 0; 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(!s.size()) {
    if(node && --node->show_count < 0)
      node->show_count = 0;

    if(!node || (!node->show_count && node->son_count))
      return 0;
    return 1;
  }

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

void count(string s) {

  int i;
  tree_node *node = tree;

  for(i = 0; 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;

  for(i = 0; 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': remove(tree, s.substr(2));break;
      case '2': count(s.substr(2));break;
      case '3': search(s.substr(2));break;
    }

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