Pagini recente » Cod sursa (job #2667391) | Cod sursa (job #2384884) | Cod sursa (job #163183) | Cod sursa (job #1536984) | Cod sursa (job #3183599)
#include <bits/stdc++.h>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct Node{
Node* letters[26];
int counter;
Node(){
this->counter = 0;
for(int i = 0; i < 25; i++)
this->letters[i] = NULL;
}
};
Node* trie = new Node();
bool Has_All_Letters_Null(Node* p){
for(int i = 0; i < 26; i++)
if(p->letters[i])
return 0;
return 1;
}
Node* Trie_Find(string word){
Node* p = trie;
for(unsigned i = 0; i < word.length(); i++){
int index = word[i] - 'a';
if(!p->letters[index]){
p->letters[index] = new Node();
}
p = p->letters[index];
}
return p;
}
void Trie_Insert(string word){
Node* p = Trie_Find(word);
p->counter++;
}
void Trie_Delete(string word){
Node* previous = Trie_Find(word.substr(0, word.length() - 1));
int index = word[word.length() - 1] - 'a';
Node* q = previous->letters[index];
if(q->counter > 0)
q->counter--;
if(q->counter == 0){
previous->letters[index] = NULL;
Node* p = trie;
for(unsigned i = 0; i < word.length() - 1; i++){
int index = word[i] - 'a';
if(Has_All_Letters_Null(p->letters[index]) && p->letters[index]->counter == 0){
p->letters[index] = NULL;
return;
}
p = p->letters[index];
}
}
}
void Trie_Count(string word){
Node* p = Trie_Find(word);
out << p->counter << '\n';
}
void Trie_Prefix(string word){
int len = 0;
Node* p = trie;
for(unsigned i = 0; i < word.length(); i++){
int index = word[i] - 'a';
if(!p->letters[index]){
out << len << '\n';
return;
}
p = p->letters[index];
++len;
}
}
int main()
{
int op;
string word;
while(in >> op >> word){
switch(op){
case 0:
Trie_Insert(word);
break;
case 1:
Trie_Delete(word);
break;
case 2:
Trie_Count(word);
break;
case 3:
Trie_Prefix(word);
break;
}
}
return 0;
}