Pagini recente » Cod sursa (job #1536854) | Cod sursa (job #2681658) | Cod sursa (job #1698520) | Cod sursa (job #1761425) | Cod sursa (job #2144306)
#include <iostream>
#include <fstream>
#include <cstring>
#define ch *x - 'a'
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct Trie{
int words, prefixes;
Trie *Edges[26];
Trie(){
words = prefixes = 0;
memset(Edges, 0, sizeof(Edges));
}
};
int v;
char s[21];
Trie *T = new Trie;
void _insert(char *x, Trie *node)
{
if(*x == NULL)
{
node->words++;
return;
}
if(node->Edges[ch] == 0)
{
node->Edges[ch] = new Trie;
node->prefixes++;
}
_insert(x+1, node->Edges[ch]);
}
bool _erase(char *x, Trie *node)
{
if(*x == NULL)
node->words--;
else if(_erase(x+1, node->Edges[ch]))
{
node->prefixes--;
node->Edges[ch] = 0;
}
if(node -> words == 0 && node->prefixes == 0 && node != T)
{
delete node;
return 1;
}
return 0;
}
int Wnumber(char *x, Trie *node)
{
if(*x == NULL)
return node->words;
if(node->Edges[ch])
return Wnumber(x+1, node->Edges[ch]);
return 0;
}
int Pref(char *x, Trie *node)
{
if(*x == NULL || node->Edges[ch] == 0)
return 0;
return Pref(x+1, node->Edges[ch]) +1;
}
int main()
{
while(f >> v >> s)
{
if(v == 0) _insert(s, T);
else if(v == 1) _erase(s, T);
else if(v == 2) g << Wnumber(s, T) << "\n";
else g << Pref(s, T) << "\n";
}
}