Cod sursa(job #2807622)

Utilizator victorzarzuZarzu Victor victorzarzu Data 23 noiembrie 2021 23:25:04
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <bits/stdc++.h>
#define oo 0x3f3f3f3f 

using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");

struct trie
{
  int ends, childrens;
  trie *children['z' - 'a' + 1];

  trie()
  {
    ends = childrens = 0;
    memset(children, 0, sizeof(children));
  }
};

trie *T = new trie;

void insert(trie *node, char *s)
{
  if(!isalpha(*s))
    {
      node -> ends++;
      return;
    }

  int next = *s - 'a';
  if(!node -> children[next])
    node -> childrens++, node -> children[next] = new trie;
  insert(node -> children[next], s + 1);
}

bool del(trie *node, char *s)
{
  if(!isalpha(*s))
    node -> ends--;
  else if(del(node -> children[*s - 'a'], s + 1))
  {
    node -> childrens--;
    node -> children[*s - 'a'] = 0;
  }
  if(node -> ends == 0 && node -> childrens == 0 && node != T)
  {
    delete node;
    return true;
  }
  return false;
}

int occ(trie *node, char *s)
{
  if(!isalpha(*s))
    return node -> ends;
  if(node -> children[*s - 'a'])
    return occ(node -> children[*s - 'a'], s + 1);
  return 0;
}

int pre(trie *node, char *s, int len)
{
  if(!isalpha(*s) || node -> children[*s - 'a'] == 0)
    return len;
  return pre(node -> children[*s - 'a'], s + 1, len + 1);
}

void read()
{
  int op;
  char s[21];
  while(f>>op>>s)
  {
    switch(op)
    {
      case 0:
        insert(T, s);
        break;
      case 1:
        del(T, s);
        break;
      case 2:
        g<<occ(T, s)<<'\n';
        break; 
      case 3:
        g<<pre(T, s, 0)<<'\n';
        break;
    }
  }
} 

int main()
{
  read();
  return 0;
}