Cod sursa(job #2222955)

Utilizator claudiu.gatinaFMI Claudiu Gatina claudiu.gatina Data 18 iulie 2018 17:15:10
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.01 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>

using namespace std;

class Trie
{
  Trie* next['z' - 'a' + 1];
  int sufixe;
  int exists;
  int letterToIdx(char c)
  {
    return (int) c - 'a';
  }
public:
  Trie():
  sufixe(0),
  exists(0)
  {
    for(int i = 0; i <= 'z' - 'a'; ++i)
      next[i] = NULL;
  }

  void add(char* s)
  {
    ++sufixe;
    if(*s == NULL)
      ++exists;
    else
    {
      int idx = letterToIdx(*s);
      if(next[idx] == NULL)
      {
        Trie *trie = new Trie();
        next[idx] = trie;
        trie->add(s + 1);
      }
      else
        next[idx]->add(s + 1);
    }
  }

  void remove(char *s)
  {
    --sufixe;
    if(*s == NULL)
    {
      --exists;
      return;
    }
    int letter = letterToIdx(*s);
    if(next[letter] != NULL)
    {
      next[letter]->remove(s + 1);
      if(next[letter]->sufixe == 0 && next[letter]->exists == 0)
      {
        Trie *p = next[letter];
        next[letter] = NULL;
        delete p;
      }
    }
  }
  int count(char *s)
  {
    if(*s == NULL)
      return exists;
    int idx = letterToIdx(*s);
    if(next[idx] != NULL)
      return next[idx]->count(s + 1);
    else
      return 0;
  }
  int prefixMax(char *s)
  {
    if(*s == NULL)
      return 0;
    int letter = letterToIdx(*s);
    if(next[letter] != NULL)
      return 1 + next[letter]->prefixMax(s + 1);
    else
      return 0;
  }
};

int main()
{
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    Trie trie;
    int op;
    char s[21];
    while(scanf("%d %s", &op, &s) == 2)
    {
      switch(op)
      {
      case 0:
        trie.add(s);
        break;
      case 1:
        trie.remove(s);
        break;
      case 2:
        printf("%d\n", trie.count(s));
        break;
      case 3:
        printf("%d\n", trie.prefixMax(s));
        break;
      default:
        break;

      }
    }
    return 0;
}