Pagini recente » Cod sursa (job #2345569) | Cod sursa (job #28646) | Cod sursa (job #1834024) | Cod sursa (job #982638) | Cod sursa (job #1982751)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
#define ll long long
#define pb push_back
const int NMax = 5e4 + 5;
#define urm nod->nxt[cuv[idx] - 'a']
int N;
struct nodTrie {
int ap,nrSub;
nodTrie *nxt[26];
nodTrie() {
ap = nrSub = 0;
for (int i=0;i < 26;++i) {
nxt[i] = 0;
}
}
}root;
void update(nodTrie*,const string&,int,int);
int query(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<<query(&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;
}
void update(nodTrie* nod,const string& cuv,int idx,int add) {
if (cuv.size() == idx) {
nod -> ap += add;
nod -> nrSub += add;
return;
}
if (urm == nullptr) {
urm = new nodTrie;
}
update(urm,cuv,idx+1,add);
nod -> nrSub += add;
if (urm -> nrSub == 0) {
delete urm;
urm = 0;
}
}
int query(nodTrie* nod,const string& cuv,int idx) {
if (cuv.size() == idx) {
return nod -> ap;
}
if (urm == nullptr) {
return 0;
}
return query(urm,cuv,idx+1);
}
int queryPrefix(nodTrie* nod,const string& cuv,int idx) {
if (urm == nullptr || cuv.size() == idx) {
return idx;
}
return queryPrefix(urm,cuv,idx+1);
}