Pagini recente » Cod sursa (job #998543) | Cod sursa (job #2889643) | Cod sursa (job #3142284) | Istoria paginii runda/ci | Cod sursa (job #2222553)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("trie.in");
ofstream cout("trie.out");
typedef struct Nod * Pointer;
struct Nod {
int frec = 0;
vector < Pointer > adia;
Nod () {
adia = vector < Pointer > ('z' - 'a' + 1, 0);
}
};
void adauga (Pointer k, string x, int s_b) {
for (int i = 0; i < x.size(); ++i) {
char lit = x[i] - 'a';
if (k->adia[lit] == 0) {
k->adia[lit] = new Nod();
}
k = k->adia[lit];
k->frec += s_b;
}
}
int nrap(Pointer k, string x) {
for (int i = 0; i < x.size(); ++i) {
char lit = x[i] - 'a';
if (k->adia[lit] == 0) {
return 0;
}
k = k->adia[lit];
}
int g(k->frec);
for (int i = 0; i <= 'z' - 'a'; ++i) {
if (k->adia[i] != 0) {
g -= k->adia[i]->frec;
}
}
return g;
}
int maxpref(Pointer k, string x) {
for (int i = 0; i < x.size(); ++i) {
char lit = x[i] - 'a';
if (k->adia[lit] == 0) {
return i;
}
if (k->adia[lit]->frec == 0) {
return i;
}
k = k->adia[lit];
}
return x.size();
}
string s;
int main()
{
Pointer k = new Nod();
int cond;
while (cin >> cond) {
cin >> s;
if (cond == 0) {
adauga(k, s, 1);
}
if (cond == 1) {
adauga(k, s, -1);
}
if (cond == 2) {
cout << nrap(k, s) << '\n';
}
if (cond == 3) {
cout << maxpref(k, s) << '\n';
}
}
return 0;
}