Cod sursa(job #2219683)

Utilizator OctavianVasileVasileOctavian OctavianVasile Data 9 iulie 2018 16:00:12
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("trie.in");
ofstream fout ("trie.out");
struct nodTrie{
  int x, y;
  nodTrie* fii [26];
  nodTrie (){
    x = y = 0;
    for (int i = 0; i < 26; i ++)fii [i] = NULL;
  }
}*root;
int a;string v;
int f1 (string s){
  nodTrie *p = root;
  for (int i = 0; i < s.size (); i ++) {
    if (p -> fii [v [i] - 'a'] == NULL)return i;
    p = p -> fii [v [i] - 'a'];
  }return s.size ();
}
void Pop (string s){
  nodTrie *p = root, *p1;
  for (int i = 0; i < s.size (); i ++){
    p1 = p;
    p = p -> fii [v [i] - 'a'];
    p -> x --;
    if (p1 -> x == 0)delete p1;
    else if (p -> x == 0)p1 -> fii [v [i] - 'a'] = NULL;
  }p -> y--;
  if (p -> x == 0)delete p;
}
void adaug (string s){
  nodTrie *p = root;
  for (int i = 0; i < s.size (); i ++) {
    if (p -> fii [v [i] - 'a'] == NULL)
      p -> fii [v [i] - 'a'] = new nodTrie;
    p = p -> fii [v [i] - 'a'];
    p -> x ++;
  }p -> y ++;
}
int f2 (string s){
  nodTrie *p = root;
  for (int i = 0; i < s.size (); i ++) {
    if (p -> fii [v [i] - 'a'] == NULL)return 0;
    p = p -> fii [v [i] - 'a'];
  }return p -> y;
}
int main (void){
  root = new nodTrie;root -> x = 1;
  while (fin >> a >> v){
    if (a == 3)fout << f1 (v) << '\n';
    if (a == 2)fout << f2 (v) << '\n';
    if (a == 1)Pop (v);
    if (a == 0)adaug (v);
  }return 0;
}