Pagini recente » Cod sursa (job #2888985) | Calibrare limite de timp | Istoria paginii runda/rglshw_2 | Cod sursa (job #2431067) | Cod sursa (job #1995594)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
#define ll long long
#define pb push_back
#define ui unsigned int
const int inf = 1e9 + 5;
const int NMax = 5e4 + 5;
int N,M;
struct nodTrie {
int app,nrSub;
nodTrie *nxt[26];
nodTrie () {
app = nrSub = 0;
for (int i=0;i < 26;++i) {
nxt[i] = nullptr;
}
}
} root;
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;
switch(tip) {
case 2: {
out<<queryApp(&root,cuv,0)<<'\n';
break;
}
case 3: {
out<<queryPrefix(&root,cuv,0)<<'\n';
break;
}
default: {
int add = (tip) ? -1 : +1;
update(&root,cuv,0,add);
}
}
in>>tip;
}
in.close();out.close();
return 0;
}
#define idx (cuv[pos] - 'a')
#define urm (node -> nxt[idx])
void update(nodTrie *node,const string& cuv,int pos,int add) {
node -> nrSub += add;
if (cuv.size() == pos) {
node -> app += add;
return;
}
if (urm == 0) {
urm = new nodTrie;
}
update(urm,cuv,pos+1,add);
if (urm -> nrSub == 0) {
delete urm;
urm = 0;
}
}
int queryApp(nodTrie *node,const string& cuv,int pos) {
if (cuv.size() == pos) {
return node -> app;
}
if (urm == 0) {
return 0;
}
return queryApp(urm,cuv,pos+1);
}
int queryPrefix(nodTrie *node,const string& cuv,int pos) {
if (urm == 0 || cuv.size() == pos) {
return pos;
}
return queryPrefix(urm,cuv,pos+1);
}