Cod sursa(job #1945744)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 29 martie 2017 17:36:55
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <iostream>
#include <cstdio>
using namespace std;

int op;
char cuv[21];

struct TrieNode
{
    int ap, nr;
    TrieNode* copii[27];
    TrieNode()
    {
        ap = 0;
        nr = 0;
        for(int i=0;i<27;i++)
            copii[i] = NULL;
    }
}*root;

void trie_insert(TrieNode* &node, char *p)
{
    if(*p == 0)
    {
        node->ap++;
        return;
    }
    if(node->copii[*p-'a'] == 0)
    {
        node->copii[*p-'a'] =  new TrieNode;
        node->nr++;
    }
    trie_insert(node->copii[*p-'a'],p+1);
}

bool trie_delete(TrieNode* &node, char *p)
{
    if(!*p)
    {
        node->ap--;
    }
    else if(trie_delete(node->copii[*p-'a'],p+1))
    {
        node->copii[*p-'a'] = 0;
        node->nr--;
    }

    if(node->ap == 0 && node->nr==0 && node !=root)
    {
        delete node;
        return 1;
    }
    return 0;
}

int trie_longest_prefix(TrieNode* &node, char *p,int k)
{
    if(!*p || !node->copii[*p-'a'])
        return k;
    //if(!node->copii[*p-'a'])
        //return k;

    return trie_longest_prefix(node->copii[*p-'a'],p+1,k+1);
}

int trie_count(TrieNode* &node, char *p)
{
    if(!*p)
    {
        return node->ap;
    }
    if(node->copii[*p-'a'])
    {
        return trie_count(node->copii[*p-'a'],p+1);
    }
    return 0;
}

int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);

    root = new TrieNode;

    while(scanf("%d %s ",&op,cuv)==2)
    {
        switch(op)
        {
        case 0:
            trie_insert(root,cuv);
            break;
        case 1:
            trie_delete(root,cuv);
            break;
        case 2:
            printf("%d\n",trie_count(root,cuv));
            break;
        case 3:
            printf("%d\n",trie_longest_prefix(root,cuv,0));
            break;
        }
    }

    return 0;
}