Pagini recente » Cod sursa (job #2332163) | Cod sursa (job #1833615) | Cod sursa (job #2795506) | Cod sursa (job #109759) | Cod sursa (job #2691297)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
class Trie {
private:
struct Node {
int cnt = 0;
int lvs = 0;
int next[26] = {};
};
vector<Node> trie{1};
public:
void insert(const string& str) {
int node = 0;
for (char chr : str) {
if (!trie[node].next[chr - 'a']) {
trie[node].next[chr - 'a'] = trie.size();
trie.emplace_back();
}
node = trie[node].next[chr - 'a'];
trie[node].lvs++;
}
trie[node].cnt++;
}
void erase(const string& str) {
int node = 0;
for (char chr : str) {
node = trie[node].next[chr - 'a'];
trie[node].lvs--;
}
trie[node].cnt--;
node = 0;
for (char chr : str) {
if (!trie[trie[node].next[chr - 'a']].lvs) {
trie[node].next[chr - 'a'] = 0;
return;
}
node = trie[node].next[chr - 'a'];
}
}
int count(const string& str) {
int node = 0;
for (char chr : str) {
if (!trie[node].next[chr - 'a'])
return 0;
node = trie[node].next[chr - 'a'];
}
return trie[node].cnt;
}
int lcp(const string& str) {
int node = 0, len = 0;
for (char chr : str) {
if (!trie[node].next[chr - 'a'])
return len;
node = trie[node].next[chr - 'a'];
len++;
}
return len;
}
};
int main() {
Trie trie;
int type; string str;
while (fin >> type >> str)
if (!type)
trie.insert(str);
else if (type == 1)
trie.erase(str);
else if (type == 2)
fout << trie.count(str) << '\n';
else
fout << trie.lcp(str) << '\n';
return 0;
}