Cod sursa(job #2126377)

Utilizator B_RazvanBaboiu Razvan B_Razvan Data 9 februarie 2018 16:15:53
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <iostream>
#include <cstdio>

using namespace std;

char s[26];
struct Node
{
    int nrCopii, aparitii;
    Node *copii[26];
    Node()
    {
        aparitii = 0;
        nrCopii = 0;
        for(int i=0; i<26; ++i)
            copii[i] = NULL;
    }
}*root;

void insertString(Node*& nod, char *p)
{
    if(!*p)
    {
        nod->aparitii++;
        return;
    }
    if(nod->copii[*p - 'a'])
        insertString(nod->copii[*p - 'a'], p + 1);
    else
    {
        nod->copii[*p - 'a'] = new Node;
        nod->nrCopii++;
        insertString(nod->copii[*p - 'a'], p + 1);
    }
}

bool deleteString(Node*& nod, char *p)
{
    if(!*p)
        nod->aparitii--;
    else if(deleteString(nod->copii[*p - 'a'], p+1))
    {
        nod->copii[*p - 'a'] = NULL;
        nod->nrCopii--;
    }
    if(nod->aparitii == 0 && nod->nrCopii == 0 && nod != root)
    {
        delete nod;
        return true;
    }
    return false;
}

int nrAparitii(Node*& nod, char *p)
{
    if(!*p)
        return nod->aparitii;
    if(nod->copii[*p - 'a'] == NULL)
        return 0;
    return nrAparitii(nod->copii[*p - 'a'], p + 1);
}

int celMaiLungPrefix(Node*& nod, char *p, int lungime)
{
    if(!*p || nod->copii[*p - 'a'] == NULL)
        return lungime;
    return celMaiLungPrefix(nod->copii[*p - 'a'], p + 1, lungime + 1);
}

void readOperations()
{
    int operatie;
    root = new Node;
    while(scanf("%d %s", &operatie, &s) != EOF)
    {
        char *p = s;
        if(operatie == 0)
            insertString(root, p);
        else if(operatie == 1)
            deleteString(root, p);
        else if(operatie == 2)
            printf("%d\n", nrAparitii(root, p));
        else
            printf("%d\n", celMaiLungPrefix(root, p, 0));
    }
}

int main()
{

    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    readOperations();
    return 0;
}