Pagini recente » Cod sursa (job #2206441) | Cod sursa (job #2902611) | Cod sursa (job #1358665) | Cod sursa (job #2244634) | Cod sursa (job #2582509)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("trie.in");
ofstream fout ("trie.out");
int op, ans, m;
char cuv[25];
bool del = 0;
struct Trie
{
int cnt, fii;
Trie *fiu[26];
Trie()
{
cnt = fii = 0;
for (int i = 0; i < 26; i++)
fiu[i] = 0;
}
};
Trie *t = new Trie;
void Insert(int n, Trie *p)
{
if (n == m)
p -> cnt++;
else
{
if (p -> fiu[cuv[n] - 'a'] == 0)
{
p -> fiu[cuv[n] - 'a'] = new Trie;
p -> fii++;
}
Insert(n + 1, p -> fiu[cuv[n] - 'a']);
}
}
void Delete(int n, Trie *p)
{
if (n == m)
{
p -> cnt--;
if (p -> cnt == 0 && p -> fii == 0)
del = 1;
}
else
{
Delete(n + 1, p -> fiu[cuv[n] - 'a']);
if (del == 1)
{
if (p -> fiu[cuv[n] - 'a'] -> cnt == 0 && p -> fiu[cuv[n] - 'a'] -> fii == 0)
{
p -> fii--;
p -> fiu[cuv[n] - 'a'] = NULL;
delete p -> fiu[cuv[n] - 'a'];
}
else
del = 0;
}
}
}
void findAp(int n, Trie *p)
{
if (n == m)
ans = p -> cnt;
else
{
if (p -> fiu[cuv[n] - 'a'] != 0)
findAp(n + 1, p -> fiu[cuv[n] - 'a']);
}
}
void findPref(int n, Trie *p)
{
if (n == m)
return;
if (p -> fiu[cuv[n] - 'a'] != 0)
{
ans++;
findPref(n + 1, p -> fiu[cuv[n] - 'a']);
}
}
int main()
{
while (fin >> op >> cuv)
{
m = strlen(cuv);
if (op == 0)
Insert(0, t);
else if (op == 1)
{
del = 0;
Delete(0, t);
}
else if (op == 2)
{
ans = 0;
findAp(0, t);
fout << ans << "\n";
}
else if (op == 3)
{
ans = 0;
findPref(0, t);
fout << ans << "\n";
}
}
return 0;
}