Pagini recente » Cod sursa (job #1702441) | album2 | Cod sursa (job #744831) | Cod sursa (job #2149886) | Cod sursa (job #824866)
Cod sursa(job #824866)
#include <set>
#include <string>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
struct node {
int end, prefix;
int child[26];
node() {
end = prefix = 0;
memset(child, -1, sizeof child);
}
};
node Trie[1 << 14];
int node_count;
void add(const string & s) {
int current = 0;
for (size_t i = 0; i < s.size(); i++) {
int c = s[i] - 'a';
if (Trie[current].child[c] == -1) {
Trie[current].child[c] = node_count++;
}
current = Trie[current].child[c];
Trie[current].prefix++;
}
Trie[current].end++;
}
void remove(const string & s) {
int current = 0;
for (size_t i = 0; i < s.size(); i++) {
int c = s[i] - 'a';
current = Trie[current].child[c];
Trie[current].prefix--;
}
Trie[current].end--;
}
int count(const string & s) {
int current = 0;
for (size_t i = 0; i < s.size(); i++) {
int c = s[i] - 'a';
if (Trie[current].child[c] == -1 || Trie[Trie[current].child[c]].prefix == 0) {
return 0;
}
current = Trie[current].child[c];
}
return Trie[current].end;
}
int lcp(const string & s) {
int current = 0;
for (size_t i = 0; i < s.size(); i++) {
int c = s[i] - 'a';
if (Trie[current].child[c] == -1 || Trie[Trie[current].child[c]].prefix == 0) {
return i;
}
current = Trie[current].child[c];
}
return s.size();
}
int n;
char str[128];
int main() {
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
node_count++;
while (scanf("%d %s", &n, str) == 2) {
string s(str);
if (n == 0) {
add(s);
}
if (n == 1) {
remove(s);
}
if (n == 2) {
printf("%d\n", count(s));
}
if (n == 3) {
printf("%d\n", lcp(s));
}
}
return 0;
}