Pagini recente » Monitorul de evaluare | Cod sursa (job #2738917) | Cod sursa (job #2269279) | Cod sursa (job #1222669) | Cod sursa (job #2063966)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
#define ll long long
#define ull unsigned long long
#define pb push_back
const int NMax = 1e3 + 5;
int T;
struct nodTrie {
int nrApp,nrSub;
nodTrie *nxt[26];
nodTrie() {
nrApp = nrSub = 0;
for (int i=0;i < 26;++i) {
nxt[i] = NULL;
}
}
}root;
void add(nodTrie*,const string&,int);
void sub(nodTrie*,const string&,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 == 0) {
add(&root,cuv,0);
}
else if (tip == 1) {
sub(&root,cuv,0);
}
else if (tip == 2) {
out<<queryApp(&root,cuv,0)<<'\n';
}
else {
out<<queryPrefix(&root,cuv,0)<<'\n';
}
in>>tip;
}
in.close();out.close();
return 0;
}
#define urm (nod->nxt[cuv[idx]-'a'])
void add(nodTrie* nod,const string& cuv,int idx) {
if (idx == cuv.size()) {
nod->nrApp += 1;
nod->nrSub += 1;
return;
}
if (urm == NULL) {
urm = new nodTrie;
}
nod->nrSub += 1;
add(urm,cuv,idx+1);
}
void sub(nodTrie* nod,const string& cuv,int idx) {
if (idx == cuv.size()) {
nod->nrApp -= 1;
nod->nrSub -= 1;
return;
}
sub(urm,cuv,idx+1);
if (urm->nrSub == 0) {
delete urm;
urm = NULL;
}
}
int queryApp(nodTrie* nod,const string& cuv,int idx) {
if (idx == cuv.size()) {
return nod->nrApp;
}
if (urm == NULL) {
return 0;
}
return queryApp(urm,cuv,idx+1);
}
int queryPrefix(nodTrie* nod,const string& cuv,int idx) {
if (idx == cuv.size() || urm == NULL) {
return idx;
}
return queryPrefix(urm,cuv,idx+1);
}