Cod sursa(job #2374329)

Utilizator GoogalAbabei Daniel Googal Data 7 martie 2019 18:02:15
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>

#define CH (*s - 'a')

using namespace std;

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

struct Trie {
  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);
  }
}

void del(Trie *p, char *s) {
  p->pr--;

  if(*s != '\0')
    del(p->fii[CH], s + 1);
}

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

int main()
{
  char s[32];

  while(in.getline(s, 31)) {
    if(s[0] == '0')
      adaug(t, s + 2);
    else if(s[0] == '1')
      del(t, s + 2);
    else if(s[0] == '2')
      out << appars(t, s + 2) << '\n';
    else if(s[0] == '3')
      out << prefix(t, s + 2, 0) << '\n';
  }

  in.close();
  out.close();

  return 0;
}