Pagini recente » Cod sursa (job #2095855) | Cod sursa (job #640171) | Cod sursa (job #1743454) | Cod sursa (job #808386) | Cod sursa (job #2549509)
#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->F[s[i] - 'a'] = nullptr;
break;
}
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;
}