Pagini recente » Cod sursa (job #1443469) | Cod sursa (job #2677366) | Cod sursa (job #2940328) | Cod sursa (job #2194869) | Cod sursa (job #2219709)
#include <iostream>
#include <stdio.h>
using namespace std;
struct Trie
{
int nrCuv, nrFii;
Trie *fiu[26];
Trie()
{
nrCuv = 0;
nrFii = 0;
for (int i = 0; i < 26; ++i)
fiu[i] = 0;
}
};
Trie *R;
char cuv[21];
void inserare (Trie *nod, char *s)
{
if ((*s) == '\n')
{
++(nod -> nrCuv);
return;
}
int pozLitera = (*s) - 'a';
if (nod -> fiu[pozLitera] == 0)
{
nod -> fiu[pozLitera] = new Trie;
++(nod -> nrFii);
}
inserare (nod -> fiu[pozLitera], s + 1);
}
int del (Trie *nod, char *s)
{
if ((*s) == '\n')
--(nod -> nrCuv);
else
{
int pozLitera = (*s) - 'a';
int rez = del (nod -> fiu[pozLitera], s + 1);
if (rez == 1)
{
nod -> fiu[pozLitera] = 0;
--(nod -> nrFii);
}
}
if (nod -> nrCuv == 0 && nod -> nrFii == 0 && nod != R)
{
delete nod;
return 1;
}
return 0;
}
int query (Trie *nod, char *s)
{
if ((*s) == '\n')
return nod -> nrCuv;
int pozLitera = (*s) - 'a';
if (nod -> fiu[pozLitera] != 0)
return query (nod -> fiu[pozLitera], s + 1);
return 0;
}
int f (Trie *nod, char *s, int k)
{
if ((*s) == '\n' || nod -> fiu[(*s) - 'a'] == 0)
return k;
return f (nod -> fiu[(*s) - 'a'], s + 1, k + 1);
}
int main()
{
R = new Trie;
freopen ("trie.in", "r", stdin);
freopen ("trie.out", "w", stdout);
fgets (cuv, 21, stdin);
while (!feof(stdin))
{
switch (cuv[0])
{
case '0' :
{
inserare (R, cuv + 2);
break;
}
case '1' :
{
del (R, cuv + 2);
break;
}
case '2' :
{
cout << query (R, cuv + 2) << '\n';
break;
}
case '3' :
{
cout << f (R, cuv + 2, 0) << '\n';
break;
}
}
fgets (cuv, 21, stdin);
}
return 0;
}