Pagini recente » Cod sursa (job #2719551) | Cod sursa (job #362559) | Cod sursa (job #445297) | Cod sursa (job #2751603) | Cod sursa (job #1212669)
#include <fstream>
#include <cstring>
#include <string>
using namespace std;
struct Trie
{
int count, nrChilds;
Trie *child[26];
Trie()
{
count = nrChilds = 0;
memset(child, 0, sizeof(child));
}
};
Trie *T = new Trie;
void solve();
void insert(Trie *node, const char *word);
bool del(Trie *node, const char *word);
int appearances(Trie *node, const char *word);
int prefix(Trie *node, const char *word);
inline int pos(char c){return c-'a';}
int main()
{
solve();
return 0;
}
void solve()
{
ifstream fin("trie.in");
ofstream fout("trie.out");
int o;
string word;
while(!fin.eof())
{
fin>>o;
fin>>word;
switch (o)
{
case 0:
insert(T,word.c_str());
break;
case 1:
del(T,word.c_str());
break;
case 2:
fout<<appearances(T,word.c_str())<<'\n';
break;
case 3:
fout<<prefix(T,word.c_str())<<'\n';
break;
default:
break;
}
}
}
void insert(Trie *node, const char *word)
{
if(*word == '\0' || *word == '\n')
{
node->count++;
return;
}
else
{
if(node->child[pos(*word)] == 0)
{
node->child[pos(*word)] = new Trie;
node->nrChilds++;
}
insert(node->child[pos(*word)], word+1);
}
}
bool del(Trie *node, const char *word)
{
if(*word == '\0' || *word == '\n')
{
node->count--;
}
else if(del(node->child[pos(*word)], word+1))
{
node->child[pos(*word)] = 0;
node->nrChilds--;
}
if(node->count == 0 && node->nrChilds == 0 && node != T)
{
delete node;
return true; //was deleted a node
}
else
{
return false; //wasn't deleted a node
}
}
int appearances(Trie *node, const char *word)
{
if(*word == '\0' || *word == '\n')
{
return node->count;
}
else if(node->child[pos(*word)] != 0)
{
return appearances(node->child[pos(*word)], word+1);
}
else
{
return 0;
}
}
int prefix(Trie *node, const char *word)
{
if(*word == '\0' || *word == '\n' || node->child[pos(*word)] == 0)
{
return 0;
}
else
{
return 1 + prefix(node->child[pos(*word)], word+1);
}
}