Pagini recente » Cod sursa (job #751466) | Cod sursa (job #1885649) | Cod sursa (job #889642) | Cod sursa (job #1929547) | Cod sursa (job #2583128)
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
const int LITERE = 26;
class Trie{
public:
Trie *characters[LITERE];
bool isLeaf;
int aparitie_cuvant;//de cate ori apare un cuvant
int aparitie_litera;// de cate ori apare o litera
Trie(){
aparitie_litera = 0;
aparitie_cuvant = 0;
isLeaf = false;
for(int i = 0;i < LITERE;++i)
characters[i] = nullptr;
}
void insert(const string& key){
Trie *iterator = this;
for(int i = 0;i < key.size();++i){
if(iterator->characters[ key[i] - 'a' ] == nullptr)
iterator->characters[ key[i] - 'a' ] = new Trie();
iterator->characters[ key[i] - 'a']->aparitie_litera++;
iterator = iterator->characters[ key[i] - 'a'];
}
iterator->isLeaf = true;
iterator->aparitie_cuvant++;
}
int numar_aparitii(const string& key){
Trie *iterator = this;
for(int i = 0;i < key.size();++i){
if(iterator->characters[ key[i] - 'a' ] == nullptr)
return 0;
iterator = iterator->characters[ key[i] - 'a' ];
}
return iterator->aparitie_cuvant;
}
int prefix_comun(const string& key){
Trie *iterator = this;
int sol = 0;
for(int i = 0;i < key.size();++i){
if(iterator->characters[ key[i] - 'a' ] != nullptr)
sol++;
else
return sol;
iterator = iterator->characters[key[i] - 'a'];
}
return sol;
}
bool haveChildren(const Trie * iterator){
for(int i = 0;i < LITERE;++i)
if(iterator->characters[i] != nullptr)
return true;
return false;
}
void deleteString(string key){
Trie *iterator = this;
for(int i = 0;i < key.size();++i){
if(iterator->characters[ key[i] - 'a'] == nullptr)
return;
iterator->characters[ key[i] - 'a' ]->aparitie_litera--;
iterator = iterator->characters[ key[i] - 'a' ];
}
iterator->aparitie_cuvant--;
if(iterator->aparitie_cuvant == 0)
iterator->isLeaf = false;
}
};
int nr;
string s;
int main(){
Trie *root = new Trie();
while(f >> nr >> s){
if(nr == 0)
root->insert(s);
else if(nr == 1)
root->deleteString(s);
else if(nr == 2)
g << root->numar_aparitii(s) << '\n';
else if(nr == 3)
g << root->prefix_comun(s) << '\n';
}
return 0;
}