Pagini recente » Cod sursa (job #1988417) | Borderou de evaluare (job #1244005) | Borderou de evaluare (job #1737650) | Cod sursa (job #1842008) | Cod sursa (job #1795260)
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdio>
#define infile "trie.in"
#define outfile "trie.out"
using namespace std;
//FILE* in = freopen(infile, "r", stdin);
ifstream in(infile);
FILE* out = freopen(outfile, "w", stdout);
char w[22];
short int op;
struct trieNode{
trieNode *tree[26];
int nrCuv;
int nrSons;
trieNode()
{
for(int i=0; i<=26; i++){
tree[i] = NULL;
}
nrCuv = 0;
nrSons = 0;
}
};
trieNode *root = new trieNode;
void inserare(trieNode* node, char* w)
{
if(*w == strlen(w)){
node->nrCuv++;
return;
}
if(node->tree[*w - 'a'] == NULL){
node->tree[*w - 'a'] = new trieNode;
node->nrSons++;
}
inserare(node->tree[*w - 'a'], w+1);
}
bool delete_word(trieNode *node, char* w)
{
if(*w == strlen(w)){
node->nrCuv--;
}else{
if(delete_word(node->tree[*w - 'a'], w+1)){
node->tree[*w - 'a'] = NULL;
node->nrSons--;
}
}
if(!node->nrCuv and !node->nrSons and node != root){
delete node;
return true;
}
return false;
}
int QuerryWords(trieNode* node, char* w)
{
if(*w == strlen(w)){
return node->nrCuv;
}
if(node->tree[*w - 'a'] != NULL){
return QuerryWords(node->tree[*w - 'a'], w+1);
}else{
return 0;
}
}
int QuerryPrefix(trieNode* node, char* w, int maxSons = 0)
{
if(*w == strlen(w) or node->tree[*w - 'a'] == NULL){
return maxSons;
}else{
return QuerryPrefix(node->tree[*w - 'a'], w+1, maxSons+1);
}
}
int main()
{
while(in>>op){
in >> w;
if(op == 0){
inserare(root, w);
}
if(op == 1){
delete_word(root, w);
}
if(op == 2){
printf("%d\n", QuerryWords(root, w));
}
if(op == 3){
printf("%d\n", QuerryPrefix(root, w));
}
}
return 0;
}