Pagini recente » Cod sursa (job #172473) | Istoria paginii runda/omg_comeback/clasament | Cod sursa (job #1369667) | Cod sursa (job #2221058) | Cod sursa (job #1963657)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
#define ind str[poz] - 'a'
struct nodTrie {
int app,appSub;
nodTrie *next[26];
nodTrie() {
app = appSub = 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 == 2) {
out<<queryApp(start,cuv,0)<<'\n';
}
else if (tip == 3) {
out<<queryPrefix(start,cuv,0)<<'\n';
}
else {
int add = (tip) ? -1 : +1;
update(start,cuv,0,add);
}
in>>tip;
}
in.close();out.close();
return 0;
}
void update(nodTrie& nod,const string& str,int poz,int add) {
if ((int)str.size() == poz) {
nod.app += add;
nod.appSub += add;
return;
}
nodTrie *urm = nod.next[ind];
if (urm == nullptr) {
urm = new nodTrie();
nod.next[ind] = urm;
}
update(*urm,str,poz+1,add);
nod.appSub += add;
if (urm->appSub == 0) {
delete urm;
nod.next[ind] = nullptr;
}
}
int queryApp(nodTrie& nod,const string& str,int poz) {
if ((int)str.size() == poz) {
return nod.app;
}
nodTrie *urm = nod.next[ind];
if (urm != nullptr) {
return queryApp(*urm,str,poz+1);
}
return 0;
}
int queryPrefix(nodTrie& nod,const string& str,int poz) {
nodTrie *urm = nod.next[ind];
if ((int)str.size() == poz || urm == nullptr) {
return poz;
}
return queryPrefix(*urm,str,poz+1);
}