Pagini recente » Cod sursa (job #2052104) | Cod sursa (job #1990064) | Cod sursa (job #2006731) | Cod sursa (job #157935) | Cod sursa (job #3350570)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct TrieNode{
int words, prefixes;
TrieNode *children[26];
TrieNode(){
words = prefixes = 0;
for(int i = 0; i<26; i++)children[i] = nullptr;
}
};
struct Trie{
TrieNode *root;
Trie(){
root = new TrieNode();
}
void insert(string word){
TrieNode *node = root;
for(char c : word){
int index = c-'a';
if(!node->children[index]){
node->children[index] = new TrieNode();
}
node->prefixes++;
node = node->children[index];
}
node->words++;
}
int countWords(string word){
TrieNode *node = root;
for(char c : word){
int index = c-'a';
if(!node->children[index] ){
return 0;
}
node = node->children[index];
}
return node->words;
}
int longestCommonPrefix(string word){
TrieNode *node = root;
int len = 0;
for(char c : word){
int index = c-'a';
if(!node->children[index] || node->children[index]->prefixes + node->children[index]->words == 0) return len;
len++;
node = node->children[index];
}
return len;
}
void deleteWord(string word){
TrieNode *node = root;
for(char c : word){
int index = c-'a';
if(!node->children[index]){
return;
}
node->prefixes--;
node = node->children[index];
}
if(node->words > 0)node->words--;
}
};
int main(){
int c;string w;
Trie t;
while(fin >> c){
fin >> w;
if(c == 0)t.insert(w);
else if(c==1)t.deleteWord(w);
else if(c==2) fout << t.countWords(w) << '\n';
else if(c==3) fout << t.longestCommonPrefix(w) << '\n';
}
return 0;
}