Pagini recente » Cod sursa (job #2133272) | Cod sursa (job #1034044) | Cod sursa (job #376580) | Cod sursa (job #2129115) | Cod sursa (job #2779690)
#include <bits/stdc++.h>
std::ifstream in("rmq.in");
std::ofstream out("rmq.out");
class TRIE {
private:
int alpha;
class Node {
public:
std::vector<Node*> child;
int cnt, end;
Node(int alpha) {
child.resize(alpha);
for (int i = 0; i < alpha; i++) {
child[i] = nullptr;
}
cnt = end = 0;
}
};
void del(Node *root, char *s) {
root -> cnt--;
if (s[0] == '\0') {
root -> end--;
return;
}
del(root -> child[s[0] - 'a'], s + 1);
if (root -> child[s[0] - 'a'] -> cnt == 0) {
Node *temp = new Node(alpha);
temp = root -> child[s[0] - 'a'];
delete temp;
root -> child[s[0] - 'a'] = nullptr;
}
}
Node *root;
public:
TRIE(int _alpha) {
alpha = _alpha;
root = new Node(alpha);
}
void add(char *s) {
Node *iter = root;
int n = (int)strlen(s);
for (int i = 0; i < n; i++) {
if (iter -> child[s[i] - 'a'] == nullptr) {
iter -> child[s[i] - 'a'] = new Node(alpha);
}
iter = iter -> child[s[i] - 'a'];
iter -> cnt++;
}
iter -> end++;
}
int count(char *s) {
Node *iter = root;
int n = (int)strlen(s);
for (int i = 0; i < n; i++) {
if (iter -> child[s[i] - 'a'] == nullptr) {
return 0;
}
iter = iter -> child[s[i] - 'a'];
}
return iter -> end;
}
int prefix(char *s) {
Node *iter = root;
int n = (int)strlen(s);
for (int i = 0; i < n; i++) {
if (iter -> child[s[i] - 'a'] == nullptr) {
return i;
}
iter = iter -> child[s[i] - 'a'];
}
return n;
}
void del(char *s) {
del(root, s);
}
};
const int maxN = 100;
int op;
char s[maxN + 5];
int main() {
TRIE ds(26);
while (in >> op >> s) {
if (op == 0) {
ds.add(s);
} else if (op == 1) {
ds.del(s);
} else if (op == 2) {
out << ds.count(s) << "\n";
} else {
out << ds.prefix(s) << "\n";
}
}
return 0;
}