Pagini recente » Cod sursa (job #2250461) | Cod sursa (job #2730224) | Istoria paginii runda/creanga10-12 | Cod sursa (job #1812083) | Cod sursa (job #1462494)
#include <cstdio>
#include <cstring>
using namespace std;
FILE *fin, *fout;
int op;
char s[37];
struct trieNode
{
int cnt, cntSum;
trieNode *child[26];
trieNode()
{
cnt = 0;
cntSum = 0;
memset(child, 0, sizeof(child));
}
};
trieNode root;
void trieInsert(trieNode *node, char *ptr)
{
if(*ptr > 'z' || *ptr < 'a')
{
node->cnt++;
return;
}
int id = *ptr - 'a';
if(node->child[id] == 0)
{
node->cntSum++;
node->child[id] = new trieNode();
}
trieInsert(node->child[id], ptr+1);
return ;
}
bool trieErase(trieNode *node, char *ptr)
{
int id = *ptr - 'a';
if(*ptr > 'z' || *ptr < 'a')
{
node->cnt--;
}
else
{
if(trieErase(node->child[id], ptr+1))
{
node->child[id] = 0;
node->cntSum--;
}
}
if(node->cnt == 0 && node->cntSum == 0 && node != &root)
{
delete node;
return true;
}
return false;
}
int trieQuery1(trieNode *node, char *ptr)
{
if(*ptr > 'z' || *ptr < 'a')
{
return node->cnt;
}
int id = *ptr - 'a';
if(node->child[id])
{
return trieQuery1(node->child[id], ptr+1);
}
return 0;
}
int trieQuery2(trieNode *node, char *ptr)
{
if(*ptr > 'z' || *ptr < 'a')
{
return 0;
}
int id = *ptr - 'a';
if(node->child[id])
if(node->child[id]->cntSum || node->child[id]->cnt) return 1 + trieQuery2(node->child[id], ptr+1);
return 0;
}
int main()
{
fin = freopen("trie.in", "r", stdin);
fout = freopen("trie.out", "w", stdout);
while(!feof(stdin))
{
scanf("%d", &op);
if(feof(stdin)) break;
scanf("%s", s);
if(op == 0) trieInsert(&root, s);
if(op == 1) trieErase(&root, s);
if(op == 2) printf("%d\n", trieQuery1(&root, s));
if(op == 3) printf("%d\n", trieQuery2(&root, s));
}
fclose(fin);
fclose(fout);
return 0;
}