Pagini recente » Cod sursa (job #1842733) | Cod sursa (job #2193872) | Cod sursa (job #42841) | Cod sursa (job #1411371) | Cod sursa (job #1131535)
#include <fstream>
using namespace std;
ifstream fin ("trie.in");
ofstream fout ("trie.out");
string w;
int n,op;
struct trie_node
{
int nr,sons;
trie_node *s[26];
trie_node ()
{
nr = 0;
sons = 0;
for (int i=0; i<26; ++i)
s[i] = NULL;
}
};
void trie_insert (trie_node *current, int i)
{
if (i == w.length ())
{
current->nr++;
return;
}
int letter = w[i]-'a';
if (current->s[letter] == NULL)
{
current->s[letter] = new trie_node;
current->sons++;
}
trie_insert (current->s[letter],i+1);
}
void trie_delete (trie_node *current, int i)
{
if (i == w.length())
{
current->nr--;
return;
}
int letter = w[i]-'a';
trie_delete (current->s[letter],i+1);
if (current->s[letter]->nr == 0 && current->s[letter]->sons == 0)
{
delete current->s[letter];
current->s[letter] = NULL;
current->sons--;
}
}
int trie_search (trie_node *current, int i)
{
if (i == w.length())
{
return current->nr;
}
int letter = w[i] - 'a';
if (current->s[letter] == NULL)
return 0;
return (trie_search(current->s[letter],i+1));
}
int trie_prefix_search (trie_node *current, int i)
{
if (i == w.length ())
return w.length ();
int letter = w[i] - 'a';
if (current->s[letter] == NULL)
return i;
return trie_prefix_search (current->s[letter],i+1);
}
int main()
{
trie_node *trie = new trie_node;
while (fin>>op>>w)
{
if (!op)
{
trie_insert (trie,0);
}
else if (op == 1)
{
trie_delete (trie,0);
}
else if (op == 2)
{
fout<<trie_search (trie,0);
}
else if (op == 3)
{
fout<<trie_prefix_search (trie,0);
}
if (op>1)
{
fout<<"\n";
}
}
}