Pagini recente » Cod sursa (job #1376590) | Cod sursa (job #508196) | Cod sursa (job #2568158) | Cod sursa (job #2921083) | Cod sursa (job #2788433)
#include <fstream>
#include <map>
#include <vector>
using namespace std;
ifstream cin ("trie.in");
ofstream cout ("trie.out");
struct strnode {
int finish_word, finish_prefix;
};
int nnode;
map <char, int> mpnext[2000001];
strnode vnode[2000001];
void add_word(string cuvant) {
int i, n, node;
node = i = 0;
n = cuvant.size();
for (i = 0; i < n; i++) {
if (mpnext[node][cuvant[i]] > 0)
node = mpnext[node][cuvant[i]];
else {
nnode++;
mpnext[node][cuvant[i]] = nnode;
node = nnode;
}
vnode[node].finish_prefix++;
}
vnode[node].finish_word++;
}
void delete_word(string cuvant) {
int i, n, node;
node = i = 0;
n = cuvant.size();
for (i = 0; i < n; i++) {
node = mpnext[node][cuvant[i]];
vnode[node].finish_prefix--;
}
vnode[node].finish_word--;
}
int query_ncuv(string cuvant) {
int i, n, node;
node = 0;
n = cuvant.size();
for (i = 0; i < n; i++) {
if (mpnext[node][cuvant[i]] > 0 && vnode[mpnext[node][cuvant[i]]].finish_prefix > 0)
node = mpnext[node][cuvant[i]];
else
return 0;
}
return vnode[node].finish_word;
}
int query_prefix(string pref) {
int i, node;
i = node = 0;
while (i < pref.size() && mpnext[node][pref[i]] > 0 && vnode[mpnext[node][pref[i]]].finish_prefix > 0) {
node = mpnext[node][pref[i]];
i++;
}
return i;
}
int main() {
int op;
string s;
while (cin >> op >> s) {
if (op == 0)
add_word(s);
else if (op == 1)
delete_word(s);
else if (op == 2)
cout << query_ncuv(s) << "\n";
else
cout << query_prefix(s) << "\n";
s = "";
}
return 0;
}