Cod sursa(job #471639)

Utilizator Smaug-Andrei C. Smaug- Data 19 iulie 2010 23:03:25
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 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 *T, 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(!eof(stdin)){
    if(line[0] == 0)
      ins(T, line+2);
    else if(line == 1)
      del(T, line+2);
    else if(line == 2)
      printf("%d\n", query(T, line+2));
    else if(line == 3)
      printf("%d\n", prefix(T, line+2, 0));
  }
  
  return 0;

}