Pagini recente » Cod sursa (job #245277) | Cod sursa (job #3255493)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
const int carMax = 25;
struct Trie {
Trie *fii[27];
int fr, nrf;
Trie(int _fr = 0) {
fr = _fr;
nrf = 0;
for(int i = 0; i <= carMax; i++) fii[i] = nullptr;
}
~Trie() {
for(int i = 0; i <= carMax; i++) delete fii[i];
}
};
Trie *radTrie;
static inline void Insert(Trie *nod, const string &val, int idx = 0) {
if(idx == val.size()) {
nod->fr++;
return;
}
int cur = val[idx] - 'a';
if(nod->fii[cur] == nullptr) {
nod->fii[cur] = new Trie();
nod->nrf++;
}
Insert(nod->fii[cur], val, idx + 1);
}
static inline bool Delete(Trie *nod, const string &val, int idx = 0) {
int cur = val[idx] - 'a';
if(idx == val.size()) nod->fr--;
else if(Delete(nod->fii[cur], val, idx + 1)) {
nod->fii[cur] = nullptr;
nod->nrf--;
}
if(nod->fr == 0 && nod->nrf == 0 && nod != radTrie) {
delete nod;
return 1;
}
return 0;
}
static inline int GetFr(Trie *nod, const string &val, int idx = 0) {
int cur = val[idx] - 'a';
if(idx == val.size()) return nod->fr;
else if(nod->fii[cur] == nullptr) return 0;
return GetFr(nod->fii[cur], val, idx + 1);
}
static inline int GetLung(Trie *nod, const string &val, int idx = 0) {
int cur = val[idx] - 'a';
if(idx == val.size()) return idx;
else if(nod->fii[cur] == nullptr) return idx;
return GetLung(nod->fii[cur], val, idx + 1);
}
int main() {
int op;
string s;
radTrie = new Trie();
while(fin >> op >> s) {
if(op == 0) Insert(radTrie, s);
else if(op == 1) Delete(radTrie, s);
else if(op == 2) fout << GetFr(radTrie, s) << "\n";
else fout << GetLung(radTrie, s) << "\n";
}
delete radTrie;
return 0;
}