Cod sursa(job #471966)

Utilizator Smaug-Andrei C. Smaug- Data 22 iulie 2010 09:51:00
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>
#include <string.h>

struct Trie {
  int cnt, nrch;
  
  Trie *child[26];
  Trie(){
    cnt = nrch = 0;
    memset(child, 0, sizeof(child));
  }
};

Trie *T = new Trie;

void ins(Trie *node, char *c){
  if(*c == '\n'){
    node->cnt++; return;
  }
  if(node->child[*c-'a'] == 0){
    node->child[*c-'a'] = new Trie;
    node->nrch++;
  }
  ins(node->child[*c-'a'], c+1);

}
int del(Trie *node, char *c){
  if(*c == '\n')
    node->cnt--;
  else if(del(node->child[*c-'a'], c+1)){
    node->child[*c-'a'] = 0;
    node->nrch--;
  }
  if(node->cnt == 0 && node->nrch == 0 && node != T){
    delete node; return 1;
  }
  return 0;

}

int query(Trie *node, char *c){
  if(*c == '\n')
    return node->cnt;

  if(node->child[*c-'a'])
    return query(node->child[*c-'a'], c+1);
  return 0;

}

int prefix(Trie *node, char *c, int n){
  if(*c == '\n' || node->child[*c-'a'] == 0)
    return n;
  return prefix(node->child[*c-'a'], c+1, n+1);
}

int main(){

  freopen("trie.in", "r", stdin);
  freopen("trie.out", "w", stdout);

  char line[32];
  fgets(line, 32, stdin);

  while(!feof(stdin)){
    if(line[0] == '0')
      ins(T, line+2);
    else if(line[0] == '1')
      del(T, line+2);
    else if(line[0] == '2')
      printf("%d\n", query(T, line+2));
    else if(line[0] == '3')
      printf("%d\n", prefix(T, line+2, 0));

    fgets(line, 32, stdin);
  }
  
  return 0;

}