Pagini recente » Cod sursa (job #2978001) | Cod sursa (job #1626644) | Cod sursa (job #2606367) | Cod sursa (job #1189032)
#include <fstream>
#include <cstring>
#include <iostream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
char line[27];
struct Trie
{
int cnt, nrfii;
Trie *fiu[27];
Trie()
{
memset(fiu, 0, sizeof(fiu));
cnt = nrfii = 0;
}
};
Trie *T = new Trie;
void ins(Trie *nod, char *s)
{
if (*s == '\0')
{
++nod->cnt;
return;
}
if (nod->fiu[int(*s - 'a')] == 0)
{
nod->fiu[int(*s - 'a')] = new Trie;
++nod->nrfii;
}
ins(nod->fiu[int(*s - 'a')], s + 1);
}
int del(Trie *nod, char *s)
{
if (*s == '\0')
--nod->cnt;
else if (del(nod->fiu[int(*s - 'a')], s + 1))
{
nod->fiu[int(*s - 'a')] = 0;
--nod->nrfii;
}
if (nod->cnt == 0 && nod->nrfii == 0 && nod != T)
{
delete nod;
return 1;
}
return 0;
}
int que(Trie *nod, char *s)
{
if (*s == '\0')
return nod->cnt;
if (nod->fiu[int(*s - 'a')])
return que(nod->fiu[int(*s - 'a')], s + 1);
return 0;
}
int pre(Trie *nod, char *s, int k)
{
if (*s == '\0' || nod->fiu[int(*s - 'a')] == 0)
return k;
return pre(nod->fiu[int(*s - 'a')], s + 1, k + 1);
}
int main()
{
while (fin.getline(line, 27))
{
if (int(line[0] - '0') == 0) ins(T, line + 2);
else if (int(line[0] - '0') == 1) del(T, line + 2);
else if (int(line[0] - '0') == 2) fout << que(T, line + 2) << '\n';
else if (int(line[0] - '0') == 3) fout << pre(T, line + 2, 0) << '\n';
}
fin.close();
fout.close();
return 0;
}