Cod sursa(job #921324)

Utilizator PetcuIoanPetcu Ioan Vlad PetcuIoan Data 20 martie 2013 21:59:27
Problema Trie Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include<cstdio>
#include<cassert>
#include<cstring>

#include<algorithm>
#include<vector>
#include<iostream>
#include<string>
#include<fstream>

using namespace std;

class nod{
public:
  int val, inw, neib[28];

  nod(){
    val = 0;
    inw = 0;
    memset(neib, 0, sizeof(neib));
  }

};

vector<nod> trie;

string x;

void update(int val){
  int start = 0;
  for(int i = 0; i < x.size(); ++i){
    int vec = trie[start].neib[x[i] - 'a'];
    if(vec == 0){
      nod vid;
      trie.push_back(vid);
      trie[start].neib[x[i] - 'a'] = trie.size() - 1;
    }
    start = trie[start].neib[x[i] - 'a'];
    trie[start].inw += val;
  }
  trie[start].val += val;
}

int query(){
  int start = 0;
  for(int i = 0; i < x.size(); ++i)
    start = trie[start].neib[x[i] - 'a'];

  return trie[start].val;
}

int query2(){
  int start = 0, ans = 0;
  for(int i = 0; i < x.size(); ++i){
    int vec = trie[start].neib[x[i] - 'a'];
    if(vec == 0)
      return ans;
    start = vec;
    if(trie[start].inw)
      ans = i + 1;
  }
  return ans;
}

int main(){
  ifstream in("trie.in");
  ofstream out("trie.out");

  nod vid;
  trie.push_back(vid);

  int tip;
  while(in >> tip){
    in >> x;

    if(tip == 0)
      update(1);
    if(tip == 1)
      update(-1);
    if(tip == 2)
      out << query() << "\n";
    if(tip == 3)
      out << query2() << "\n";
  }

  return 0;
}