Pagini recente » Cod sursa (job #803753) | Cod sursa (job #2132933) | Cod sursa (job #389300) | Cod sursa (job #1665995) | Cod sursa (job #1403584)
#include <fstream>
#include <cstring>
using namespace std;
ifstream f ("trie.in");
ofstream g ("trie.out");
struct trie
{
int aparitii;
trie *muchii[30];
} *t;
void initializare (trie *&x)
{
x = new trie;
x -> aparitii = 0;
for (int i = 1; i <= 26; i ++)
x -> muchii[i] = NULL;
}
void creare_muchie (trie *x, int y)
{
trie *c;
initializare (c);
x -> muchii[y] = c;
}
void adauga_cuvant (trie *x, char cuvant[23])
{
trie *curent = x;
int l = strlen (cuvant);
int primul;
for (int i = 0; i < l; i ++)
{
primul = int (cuvant[i] - 96);
if (curent -> muchii[primul])
{
curent = curent -> muchii[primul];
if (i == l - 1)
++ curent -> aparitii;
}
else
{
creare_muchie (curent, primul);
curent = curent -> muchii[primul];
if (i == l - 1)
++ curent -> aparitii;
}
}
}
void sterge_trie (trie *&x)
{
delete x;
}
void sterge_cuvant (char cuvant[23])
{
trie *curent = t, *secund;
int primul;
int l = strlen (cuvant);
for (int i = 0; i < l; i ++)
{
primul = int (cuvant[i] - 96);
secund = curent;
curent = curent -> muchii[primul];
}
-- curent -> aparitii;
if (! curent -> aparitii)
{
for (int i = 1; i <= 26; i ++)
if (curent -> muchii[i])
return;
sterge_trie (curent);
secund -> muchii[primul] = 0;
}
}
int nr_ap (char cuvant[23])
{
trie *curent = t;
int primul;
int l = strlen (cuvant);
bool ok = 1;
for (int i = 0; i < l; i ++)
{
primul = int (cuvant[i] - 96);
if (curent -> muchii[primul])
curent = curent -> muchii[primul];
else
{
ok = 0;
break;
}
}
if (! ok)
return 0;
return curent -> aparitii;
}
int prefix (char cuvant[23])
{
trie *curent = t;
int primul, i;
int l = strlen (cuvant);
for (i = 0; i < l; i ++)
{
primul = int (cuvant[i] - 96);
if (! curent -> muchii[primul])
break;
curent = curent -> muchii[primul];
}
return i;
}
void rezolvare ()
{
int tip;
char cuvant[23];
while (f >> tip >> cuvant)
{
if (! tip)
adauga_cuvant (t, cuvant);
else if (tip == 1)
sterge_cuvant (cuvant);
else if (tip == 2)
g << nr_ap (cuvant) << '\n';
else
g << prefix (cuvant) << '\n';
}
}
int main()
{
initializare (t);
rezolvare ();
f.close ();
g.close ();
return 0;
}