Cod sursa(job #1947973)

Utilizator cristii2000cristiiPanaite Cristian cristii2000cristii Data 31 martie 2017 16:03:08
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 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 add(TrieNode* &node, char *p)
{
    if(*p == 0)
    {
        node -> ap++;
        return;
    }
    if(node ->copii[*p-'a'] == 0)
    {
        node -> copii[*p-'a'] = new TrieNode;
        node -> nr++;
    }
    add(node -> copii[*p - 'a'], p+1);
}

bool del(TrieNode* &node, char *p)
{
    if(!*p)
    {
        node -> ap--;
    }
    else if(del(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 counting(TrieNode* &node, char *p)
{
    if(!*p)
    {
        return node -> ap;
    }
    if(node -> copii[*p-'a'])
    {
        return counting(node -> copii[*p-'a'],p+1);
    }
    return 0;
}

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

void read()
{
    while(scanf("%d %s", &op, cuv)==2)
    {
        switch(op)
        {
            case 0: add(root, cuv); break;
            case 1: del(root, cuv); break;
            case 2: printf("%d\n", counting(root,cuv)); break;
            case 3: printf("%d\n", prefix(root,cuv,0)); break;
        }
    }
}

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

    root = new TrieNode;

    read();

    return 0;
}