Pagini recente » Cod sursa (job #186728) | Cod sursa (job #2772145) | Monitorul de evaluare | Cod sursa (job #514950) | Cod sursa (job #1112878)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie {
Trie *son[26];
int ap, ln;
Trie() {
memset(son, '\0', sizeof(son));
ap = ln = 0;
}
};
Trie *T = new Trie;
char s[22];
void add(Trie *&T, int i) {
if (s[i] == '\0') {
++T->ap;
return ;
}
if (!T->son[s[i] - 'a'])
T->son[s[i] - 'a'] = new Trie;
++T->son[s[i] - 'a']->ln;
add(T->son[s[i] - 'a'], i + 1);
}
void del(Trie *&T, int i) {
if (s[i] == '\0') {
--T->ln; --T->ap;
if (T->ln == 0) {
delete T;
T = '\0';
}
return ;
}
del(T->son[s[i] - 'a'], i + 1);
--T->ln;
if (T->ln == 0) {
delete T;
T = '\0';
}
}
int nrap(Trie *T, int i) {
if (s[i] == '\0')
return T->ap;
return nrap(T->son[s[i] - 'a'], i + 1);
}
int pref(Trie *T, int i) {
if (s[i] == '\0')
return i - 1;
if (T->son[s[i] - 'a'])
return pref(T->son[s[i] - 'a'], i + 1);
return i - 1;
}
int main() {
int op, len;
while (fin >> op) {
fin >> s + 1;
len = strlen(s + 1);
s[len + 1] = '\0';
if (op == 0)
add(T, 1);
else if (op == 1)
del(T, 1);
else if (op == 2)
fout << nrap(T, 1) << '\n';
else if (op == 3)
fout << pref(T, 1) << '\n';
}
fin.close();
fout.close();
}