Cod sursa(job #2373535)

Utilizator toadehuPuscasu Razvan Stefan toadehu Data 7 martie 2019 13:59:32
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <cstring>
#define CH (*s - 'a')

using namespace std;

ifstream in("trie.in");
ofstream out("trie.out");

struct Trie {
  short int pr;
  Trie *fii[26];
};

Trie *T= new Trie;

void adaug(Trie *p, char *s) {
  p -> pr++;
  if(*s != '\0') {
    if(p->fii[CH] == NULL)
      p->fii[CH] = new Trie();
    adaug(p->fii[CH], s + 1);
  }
}

int elim( Trie *p, char *s){
  p->pr--;
  if(*s != '\0') {
    elim(p->fii[CH], s + 1);
  }
}

int apar(Trie *p, char *s) {
  if(*s != '\0') {
    if(p->fii[CH] == NULL)
      return 0;
    else
      return apar(p->fii[CH], s + 1);
  } else {
    int res = p->pr;
    for(int i = 0; i < 26; i++) {
      if(p->fii[i] != NULL)
        res -= p->fii[i]->pr;
    }
    return res;
  }
}

int prefix(Trie *p, char *s, int k) {
  if(*s == '\0')
    return k;
  else {
    if(p->fii[CH] != NULL && 0 < p->fii[CH]->pr)
      return prefix(p->fii[CH], s + 1, k + 1);
    else
      return k;
  }
}

int main()
{
  char s[32];
  while(in.getline(s, 31)) {
    if(s[0] == '0')
      adaug(T, s + 2);
    else if(s[0] == '1')
      elim(T, s + 2);
    else if(s[0] == '2')
      out<< apar(T, s + 2) <<'\n';
    else
      out<< prefix(T, s + 2, 0) <<'\n';
  }

  in.close();
  out.close();
  return 0;
}