Cod sursa(job #2075012)

Utilizator B_RazvanBaboiu Razvan B_Razvan Data 25 noiembrie 2017 10:45:17
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <iostream>
#include <cstdio>

using namespace std;

char s[25];

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 lungMaxPrefix(Node*& nod, char *p, int raspuns)
{
    if(!*p || nod->copii[*p - 'a'] == NULL)
        return raspuns;
    return lungMaxPrefix(nod->copii[*p - 'a'], p + 1, raspuns + 1);
}

void readOperations()
{
    int operatie = -1;
    root = new Node;
    while(scanf("%d %s\n", &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", lungMaxPrefix(root, p, 0));
    }
}

int main()
{

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