Pagini recente » Cod sursa (job #1588552) | Cod sursa (job #2746426) | Cod sursa (job #411248) | Cod sursa (job #3190318) | Cod sursa (job #2549528)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Nod
{
int cnt = 0;
Nod* F[26];
};
Nod* r = new Nod();
void Add(char s[])
{
Nod* nod = r;
for (int i = 0; s[i] != '\0'; ++i)
{
if (nod->F[s[i] - 'a'] == nullptr)
nod->F[s[i] - 'a'] = new Nod();
nod = nod->F[s[i] - 'a'];
++nod->cnt;
}
}
void Delete(char s[])
{
Nod* nod = r;
for (int i = 0; s[i] != '\0'; ++i)
{
--(nod->F[s[i] - 'a']->cnt);
if (nod->F[s[i] - 'a']->cnt == 0)
{
Nod* ptr = nod->F[s[i] - 'a'];
nod->F[s[i] - 'a'] = nullptr;
break;
Nod* ptr2;
do
{
ptr2 = nullptr;
for (int i = 0; i < 26; ++i)
{
if (ptr->F[i] != nullptr)
{
ptr2 = ptr->F[i];
break;
}
}
delete ptr;
ptr = ptr2;
}
while (ptr != nullptr);
}
nod = nod->F[s[i] - 'a'];
}
}
int Count(char s[])
{
Nod* nod = r;
bool ok = true;
for (int i = 0; s[i] != '\0'; ++i)
{
if (nod->F[s[i] - 'a'] == nullptr)
{
ok = false;
break;
}
nod = nod->F[s[i] - 'a'];
}
if (!ok)
return 0;
int sum = 0;
for (int i = 0; i < 26; ++i)
{
if (nod->F[i] != nullptr)
sum += nod->F[i]->cnt;
}
return nod->cnt - sum;
}
int Max(char s[])
{
int cnt = 0;
Nod* nod = r;
for (int i = 0; s[i] != '\0'; ++i)
{
if (nod->F[s[i] - 'a'] != nullptr)
{
++cnt;
nod = nod->F[s[i] - 'a'];
}
else break;
}
return cnt;
}
int main()
{
int c;
char s[21];
while (fin >> c >> s)
{
if (c == 0)
Add(s);
else if (c == 1)
Delete(s);
else if (c == 2)
fout << Count(s) << '\n';
else if (c == 3)
fout << Max(s) << '\n';
}
return 0;
}