Pagini recente » Cod sursa (job #3218446) | Cod sursa (job #1058892) | Cod sursa (job #1876476) | Cod sursa (job #2180033) | Cod sursa (job #2187041)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie
{
int nr, nrfii;
trie *fiu[26];
trie()
{
nr = nrfii = 0;
memset(fiu, 0, sizeof(fiu));
}
};
trie *t = new trie;
void inserare(trie *nod, char *s);
bool stergere(trie *nod, char *s);
int numarare(trie *nod, char *s);
int lungime_prefix(trie *nod, char *s, int k);
int main()
{
char sir[35];
while (fin.getline(sir, 30))
{
switch(sir[0])
{
case '0': inserare(t, sir + 2); break;
case '1': stergere(t, sir + 2); break;
case '2': fout << numarare(t, sir + 2) << '\n'; break;
case '3': fout << lungime_prefix(t, sir + 2, 0) << '\n'; break;
}
}
fout.close();
return 0;
}
void inserare(trie *nod, char *s)
{
if (*s == 0)
{
nod->nr++;
return ;
}
if (nod->fiu[*s - 'a'] == 0)
{
nod->fiu[*s - 'a'] = new trie;
nod->nrfii++;
}
inserare(nod->fiu[*s - 'a'], s + 1);
}
bool stergere(trie *nod, char *s)
{
if (*s == 0)
nod->nr--;
else if (stergere(nod->fiu[*s - 'a'], s + 1))
{
nod->fiu[*s - 'a'] = 0;
nod->nrfii--;
}
if (nod->nr == 0 && nod->nrfii == 0 && nod != t)
{
delete nod;
return 1;
}
return 0;
}
int numarare(trie *nod, char *s)
{
if (*s == 0)
return nod->nr;
if (nod->fiu[*s - 'a'])
return numarare(nod->fiu[*s - 'a'], s + 1);
return 0;
}
int lungime_prefix(trie *nod, char *s, int k)
{
if (*s == 0 || nod->fiu[*s - 'a'] == 0)
return k;
return lungime_prefix(nod->fiu[*s - 'a'], s + 1, k + 1);
}