Pagini recente » Cod sursa (job #812683) | Cod sursa (job #1037934) | Cod sursa (job #3129113) | Cod sursa (job #1938041) | Cod sursa (job #2693713)
#include <vector>
#include <fstream>
#include <algorithm>
#include <iostream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
char t[100]; int n, rez;
struct Trie {
Trie* fii[28];
int nrp;
int nrc;
Trie() {
for (int i = 0; i <= 27; ++i)
fii[i] = nullptr;
nrp = nrc = 0;
}
};
Trie* rad = new Trie();
void add(Trie*& aux, int i) {
if (i == n) {
aux->nrc++;
aux->nrp++;
return;
}
if (i != n) {
if (aux->fii[t[i] - 'a'] == nullptr)
aux->fii[t[i] - 'a'] = new Trie();
if (i)
aux->nrp++;
add(aux->fii[t[i] - 'a'], i + 1);
}
}
void erase(Trie*& aux, int i) {
if (i == n) {
aux->nrc = max(0, aux->nrc - 1);
aux->nrp = max(0, aux->nrp - 1);
return;
}
if (aux->fii[t[i] - 'a'] != nullptr) {
if (i)
aux->nrp = max(0, aux->nrp - 1);
erase(aux->fii[t[i] - 'a'], i + 1);
if (aux->fii[t[i] - 'a']->nrp == 0)
aux->fii[t[i] - 'a'] = nullptr;
}
}
void query1(Trie*& aux, int i) {
if (i == n) {
rez = aux->nrc;
return;
}
if (aux->fii[t[i] - 'a'] != nullptr)
query1(aux->fii[t[i] - 'a'], i + 1);
}
void query2(Trie*& aux, int i) {
if (aux->fii[t[i] - 'a'] == nullptr) {
rez = i;
return;
}
query2(aux->fii[t[i] - 'a'], i + 1);
}
int main() {
int N;
while (fin >> N) {
fin >> t;
n = strlen(t);
rez = 0;
Trie* aux = rad;
if (N == 0) {
add(aux, 0);
continue;
}
if (N == 1) {
erase(aux, 0);
continue;
}
if (N == 2) {
query1(aux, 0);
fout << rez << "\n";
}
else {
query2(aux, 0);
fout << rez << "\n";
}
}
return 0;
}