Cod sursa(job #2662094)

Utilizator Iulia25Hosu Iulia Iulia25 Data 23 octombrie 2020 15:37:41
Problema Trie Scor 5
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#include <iostream>

using namespace std;

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

struct Trie  {
  int nr, sf;
  Trie *fiu[30];
} *T;

void adaug(string s, int semn)  {
  Trie *aux = T;
  aux -> nr += semn;
  for (int i = 0; i < s.size(); ++i)  {
    int c = s[i] - 'a';
    if (aux -> fiu[c] == NULL)  {
      Trie* auxf = new Trie;
      auxf -> nr = 0;
      aux -> fiu[c] = auxf;
    }
    aux = aux -> fiu[c];
    aux -> nr += semn;
  }
  aux -> sf += semn;
}

int nr_aparitii(string s)  {
  Trie *aux = T;
  for (int i = 0; i < s.size(); ++i)  {
    int c = s[i] - 'a';
    if(aux -> fiu[c] == NULL)  {
      return 0;
    }
    aux = aux -> fiu[c];
  }
  return aux -> sf;
}

int cmlpc(string s)  {
  int ans = 0;
  Trie *aux = T;
  for (int i = 0; i < s.size() - 1; ++i)  {
    int c = s[i] - 'a';
    if (aux -> fiu[c] == NULL)
      return ans;
    aux = aux -> fiu[c];
    if (aux -> nr > 0)
      ans = i + 1;
  }
  return ans;
}

int main()  {
  int type;
  string s = "";
  T = new Trie;
  while (fin >> type >> s)  {
    switch(type)  {
      case 0: adaug(s, 1); break;
      case 1: adaug(s, -1); break;
      case 2: fout << nr_aparitii(s) << '\n'; break;
      case 3: fout << cmlpc(s) << '\n'; break;
    }
  }
  return 0;
}