Pagini recente » Cod sursa (job #1427246) | Cod sursa (job #1957005) | Cod sursa (job #1056034) | Cod sursa (job #872502) | Cod sursa (job #2144255)
#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[35];
Trie *T = new Trie();
inline void _insert(char *x, Trie *node)
{
if(*x == 0)
{
node->words++;
return;
}
if(node->Edges[ch] == 0)
{
node->Edges[ch] = new Trie();
node->prefixes++;
}
_insert(x+1, node->Edges[ch]);
}
inline bool _erase(char *x, Trie *node)
{
if(*x == 0)
{
node->words--;
if(node->words == 0 && node->prefixes == 0 && node != T)
{
delete node;
return 1;
}
return 0;
}
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;
}
inline int Wnumber(char *x, Trie *node)
{
if(*x == 0)
return node->words;
if(node->Edges[ch] == 0)
return 0;
return Wnumber(x+1, node->Edges[ch]);
}
inline int Pref(char *x, Trie *node)
{
if(*x == 0)
return 0;
if(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";
}
}