Pagini recente » Cod sursa (job #293542) | Cod sursa (job #1964760) | Cod sursa (job #522817) | Cod sursa (job #1692917) | Cod sursa (job #424597)
Cod sursa(job #424597)
#include <cstdio>
#include <vector>
using namespace std;
vector <int> trie[100000];
long nNodes, n, code;
char word[25];
void addWord(long node, long position)
{
long letter = word[position] - 'a' + 2;
if (!trie[node][letter])
{
trie[++nNodes].push_back(0);
trie[nNodes].push_back(1);
trie[node][letter] = nNodes;
for (long i = 1; i <= 26; ++i)
trie[nNodes].push_back(0);
if (position == n - 1)
++trie[nNodes][0];
else
addWord(nNodes, position + 1);
}
else
{
if (position == n - 1)
{
++trie[trie[node][letter]][0];
++trie[trie[node][letter]][1];
}
else
{
addWord(trie[node][letter], position + 1);
++trie[trie[node][letter]][1];
}
}
}
void deleteWord(long node, long position)
{
long letter = word[position] - 'a' + 2;
if (!trie[node][letter])
return;
else
{
if (position == n - 1)
{
--trie[trie[node][letter]][0];
--trie[trie[node][letter]][1];
if (!trie[trie[node][letter]][1])
trie[node][letter] = 0;
}
else
{
deleteWord(trie[node][letter], position + 1);
--trie[trie[node][letter]][1];
if (!trie[trie[node][letter]][1])
trie[node][letter] = 0;
}
}
}
long query1(long node, long position)
{
long letter = word[position] - 'a' + 2;
if (!trie[node][letter])
return 0;
else
{
if (position == n - 1)
return trie[trie[node][letter]][0];
else
query1(trie[node][letter], position + 1);
}
}
long query2(long node, long position)
{
long letter = word[position] - 'a' + 2;
if (!trie[node][letter])
return position;
else
{
if (position == n - 1)
return position + 1;
query2(trie[node][letter], position + 1);
}
}
int main()
{
freopen ("trie.in", "rt", stdin);
freopen ("trie.out", "wt", stdout);
for (long i = 1; i <= 28; ++i)
trie[0].push_back(0);
while (scanf("%ld %s", &code, word) != EOF)
{
n = strlen(word);
switch (code)
{
case 0:
{
addWord(0, 0);
break;
}
case 1:
{
deleteWord(0, 0);
break;
}
case 2:
{
printf("%ld\n", query1(0, 0));
break;
}
case 3:
{
printf("%ld\n", query2(0, 0));
break;
}
}
}
return 0;
}