Pagini recente » amcbn | Cod sursa (job #18879) | Cod sursa (job #1032489) | Cod sursa (job #973340) | Cod sursa (job #1791491)
#include <iostream>
#include <fstream>
#include <cstring>
#define infile "trie.in"
#define outfile "trie.out"
using namespace std;
ifstream in(infile);
ofstream out(outfile);
string w;
short int op;
struct trieNode{
trieNode* tree[26];
int nrCuv;
int nrSons;
trieNode()
{
memset(tree, NULL, sizeof(tree));
nrCuv = 0;
nrSons = 0;
}
};
trieNode *root = new trieNode;
void inserare(trieNode *node, string w, int nrCar=0)
{
if(nrCar == w.size()){
node->nrCuv++;
return;
}
if(node->tree[w.at(nrCar) - 'a'] == NULL){
node->tree[w.at(nrCar) - 'a'] = new trieNode;
node->nrSons++;
}
inserare(node->tree[w.at(nrCar) - 'a'], w, nrCar+1);
}
bool delete_word(trieNode *node, string w, int nrCar=0)
{
if(nrCar == w.size()){
node->nrCuv--;
}else{
if(delete_word(node->tree[w.at(nrCar) - 'a'], w, nrCar+1)){
node->tree[w.at(nrCar) - 'a'] = NULL;
node->nrSons--;
}
}
if(!node->nrCuv and !node->nrSons and node != root){
trieNode* del = node;
delete del;
return true;
}
return false;
}
int QuerryWords(trieNode* node, string w, int nrCar=0)
{
if(nrCar == w.size()){
return node->nrCuv;
}else{
return QuerryWords(node->tree[w.at(nrCar) - 'a'], w, nrCar+1);
}
return 0;
}
int QuerryPrefix(trieNode* node, string w, int nrCar=0, int maxSons = 0)
{
if(nrCar == w.size() or node->tree[w.at(nrCar) - 'a'] == NULL){
return maxSons;
}else{
return QuerryPrefix(node->tree[w.at(nrCar) - 'a'], w, nrCar+1, maxSons+1);
}
}
int main()
{
while(in >> op >> w){
if(op == 0){
inserare(root, w);
}
if(op == 1){
delete_word(root, w);
}
if(op == 2){
out << QuerryWords(root, w) << '\n';
}
if(op == 3){
out << QuerryPrefix(root, w) << '\n';
}
}
return 0;
}