Pagini recente » Cod sursa (job #637498) | Cod sursa (job #121658) | Cod sursa (job #3177232) | Cod sursa (job #2240911) | Cod sursa (job #2518877)
#include <fstream>
#include <cstring>
#include <string>
using namespace std;
ifstream cin ("trie.in");
ofstream cout ("trie.out");
struct TRIE
{
int frecv;
int leaves;
TRIE* next[26];
TRIE() {
frecv = 0;
leaves = 0;
memset(next, NULL, sizeof(next));
}
};
TRIE *root = new TRIE();
void insert_trie(TRIE *&node, string &s, int cnt)
{
node -> frecv += 1;
if(cnt == (int)s.size()) {
node -> leaves += 1;
}
else {
int curr = s[cnt] - 'a';
if(node -> next[curr] == nullptr)
node -> next[curr] = new TRIE();
insert_trie(node -> next[curr], s, cnt + 1);
}
}
void remove_trie(TRIE *&node, string &s, int cnt)
{
node -> frecv -= 1;
if(cnt == (int)s.size()) {
node -> leaves -= 1;
if(node -> frecv == 0) {
delete node;
node = nullptr;
}
return;
}
int curr = s[cnt] - 'a';
remove_trie(node -> next[curr], s, cnt + 1);
if(node->frecv == 0 && node != root) {
delete node;
node = nullptr;
}
}
int word_count(string &s)
{
auto node = root;
for(auto ch: s) {
int curr = ch - 'a';
if(node -> next[curr] == nullptr)
return 0;
node = node -> next[curr];
}
return node -> leaves;
}
int lcp(string &s)
{
auto node = root;
int ans = 0;
for(auto ch : s) {
int curr = ch - 'a';
if(node -> next[curr] == nullptr)
return ans;
node = node -> next[curr];
ans++;
}
return ans;
}
int main() {
int type;
string s;
while(cin >> type >> s) {
if(type == 0)
insert_trie(root, s, 0);
else {
if(type == 1)
remove_trie(root, s, 0);
else {
if(type == 2)
cout << word_count(s) << "\n";
else
cout << lcp(s) << "\n";
}
}
}
return 0;
}