Pagini recente » Cod sursa (job #1004465) | Cod sursa (job #2847656) | Cod sursa (job #224656) | Cod sursa (job #1855090) | Cod sursa (job #2674487)
#include <fstream>
#include <cstring>
using namespace std;
ifstream cin ("trie.in");
ofstream cout ("trie.out");
struct nod
{
int cnt, sons;
nod *son[26];
nod()
{
cnt = sons = 0;
for (int i = 0; i < 26; i++)
son[i] = 0;
}
};
nod *trie = new nod;
void update(nod *trie, char *s, int val, int lit)
{
int next;
if (!lit)
{
trie->cnt += val;
return;
}
if (trie->son[*s - 'a'] == 0)
{
trie->son[*s - 'a'] = new nod;
trie->sons++;
}
update((trie->son[*s - 'a']), s + 1, val, lit - 1);
if (val < 0)
{
nod *fiu = trie->son[*s - 'a'];
if ((fiu->cnt) == 0 && fiu->sons==0)
{
delete(fiu);
trie->sons--;
trie->son[*s - 'a'] = 0;
}
}
}
int query(nod *trie, char *s, int lit)
{
if (!lit)
return trie->cnt;
if (trie->son[*s - 'a'] == 0)
return 0;
return query(trie->son[*s - 'a'], s + 1,lit - 1);
}
int prefix(nod *trie, char *s, int lvl, int lit)
{
if (!lit)
return lvl;
if (trie->son[*s - 'a'] == 0)
return lvl;
return prefix(trie->son[*s - 'a'], s + 1, lvl + 1, lit - 1);
}
char s[25];
int main()
{
int op;
trie->cnt = 1;
while (cin >> op >> s)
{
int lit = strlen(s);
if (op == 0)
update(trie, s, 1, lit);
else
if (op == 1)
update(trie, s, -1, lit);
else
if (op == 2)
cout << query(trie, s, lit);
else
if (op == 3)
cout << prefix(trie, s, 0, lit);
if (op > 1)
cout << '\n';
}
return 0;
}