Pagini recente » Profil CristyMEE | Diferente pentru runda/pre_oni_gim2015/clasament intre reviziile 7 si 2 | Cod sursa (job #1973670)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <iomanip>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
#define idx cuv[pos] - 'a'
typedef long long ll;
const int NMax = 1e5 + 5;
struct nodTrie {
int app,appFii;
nodTrie *next[26];
nodTrie() {
app = appFii = 0;
for (int i=0;i<26;++i) {
next[i] = nullptr;
}
}
}start;
void update(nodTrie&,const string&,int,int);
int queryApp(nodTrie&,const string&,int);
int queryPrefix(nodTrie&,const string&,int);
int main() {
int tip;
string cuv;
in>>tip;
while (!in.fail()) {
in>>cuv;
if (tip == 3) {
out<<queryPrefix(start,cuv,0)<<'\n';
}
else if (tip == 2) {
out<<queryApp(start,cuv,0)<<'\n';
}
else {
int add = (tip == 0) ? +1 : -1;
update(start,cuv,0,add);
}
in>>tip;
}
in.close();out.close();
return 0;
}
void update(nodTrie& nod,const string& cuv,int pos,int add) {
if (cuv.size() == pos) {
nod.app += add;
nod.appFii += add;
return;
}
if (nod.next[idx] == nullptr) {
nod.next[idx] = new nodTrie;
}
nodTrie *urm = nod.next[idx];
nod.appFii += add;
update(*urm,cuv,pos+1,add);
if (urm->appFii == 0) {
delete urm;
nod.next[idx] = nullptr;
}
}
int queryApp(nodTrie& nod,const string& cuv,int pos) {
if (cuv.size() == pos) {
return nod.app;
}
nodTrie *urm = nod.next[idx];
if (urm == nullptr) {
return 0;
}
return queryApp(*urm,cuv,pos+1);
}
int queryPrefix(nodTrie& nod,const string& cuv,int pos) {
if (nod.next[idx] == nullptr || cuv.size() == pos) {
return pos;
}
nodTrie *urm = nod.next[idx];
return queryPrefix(*urm,cuv,pos+1);
}