Cod sursa(job #1462494)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 18 iulie 2015 12:36:55
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#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;
}