Pagini recente » Cod sursa (job #55486) | Cod sursa (job #169711) | Cod sursa (job #503644) | Cod sursa (job #770934) | Cod sursa (job #3041265)
#include <fstream>
#include <string>
using namespace std;
ifstream in ("trie.in");
ofstream out ("trie.out");
struct trie{
int fr, nrfii;
trie * fii[26];
trie()
{
fr = 0;
nrfii = 0;
for (int i = 0; i < 26; i++)
{
fii[i] = 0;
}
}
};
string s;
trie * t = new trie;
void ins (trie * nod, int poz)
{
if (poz == s.size())
{
nod -> fr++;
return;
}
int urm = (s[poz] - 'a');
if (nod -> fii[urm] == 0)
{
nod -> fii[urm] = new trie;
nod -> nrfii++;
}
ins(nod -> fii[urm], poz + 1);
}
bool del (trie * nod, int poz)
{
if (poz == s.size())
{
nod -> fr--;
}
else
{
int urm = (s[poz] - 'a');
if (del(nod -> fii[urm], poz + 1))
{
nod -> nrfii--;
nod -> fii[urm] = 0;
}
}
if (nod -> fr == 0 && nod -> nrfii == 0 && nod != t)
{
delete nod;
return 1;
}
return 0;
}
int query (trie * nod, int poz)
{
if (poz == s.size())
{
return nod -> fr;
}
int urm = (s[poz] - 'a');
if (nod -> fii[urm] != 0)
{
return query(nod -> fii[urm], poz + 1);
}
return 0;
}
int pref (trie * nod, int poz)
{
if (poz == s.size())
{
return poz;
}
int urm = (s[poz] - 'a');
if (nod -> fii[urm] == 0)
{
return poz;
}
return pref(nod -> fii[urm], poz + 1);
}
int main ()
{
int op;
while (in >> op >> s)
{
if (op == 0)
{
ins(t, 0);
}
if (op == 1)
{
del(t, 0);
}
if (op == 2)
{
out << query(t, 0) << '\n';
}
if (op == 3)
{
out << pref(t, 0) << '\n';
}
}
in.close();
out.close();
return 0;
}