Cod sursa(job #2817370)

Utilizator victorzarzuZarzu Victor victorzarzu Data 13 decembrie 2021 16:18:05
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <bits/stdc++.h>

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

struct trie{
  int number, nrfii;
  trie *children[26];

  trie()
  {
    number = nrfii = 0;
    memset(children, 0, sizeof(children));
  }
};

trie *T = new trie;

void insert(trie *node, char *word)
{
  if(!isalpha(*word))
  {
    node -> number++;
    return;
  }
  int next = *word - 'a';
  if(!(node -> children[next]))
    node -> nrfii++, node -> children[next] = new trie;
  insert(node -> children[next], word + 1);
}

bool del(trie *node, char *word)
{
  int next = *word - 'a';
  if(!isalpha(*word))
    node -> number--; 
  else if(del(node -> children[next], word + 1))
    {
      node -> nrfii--;
      node -> children[next] = 0;
    }

  if(node -> nrfii == 0 && node -> number == 0 && node != T)
    {
      delete node;
      return true;
    }
  return false;
}

int occ(trie *node, char *word)
{
  if(!isalpha(*word))
    return node -> number;

  if(node -> children[*word - 'a'])
    return occ(node -> children[*word - 'a'], word + 1);
  return 0;
}

int pref(trie *node, char *word, int k)
{
  if(!isalpha(*word) || !(node -> children[*word - 'a']))
    return k;
  return pref(node -> children[*word - 'a'], word + 1, k + 1);
}

void read()
{
  int x;
  char word[21];
  while(f>>x>>word)
  {
    if(!x)
      insert(T, word);
    else if(x == 1)
      del(T, word);
    else if(x == 2)
      g<<occ(T, word)<<'\n';
    else
      g<<pref(T, word, 0)<<'\n';
  }
}


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