Cod sursa(job #1957901)

Utilizator jurjstyleJurj Andrei jurjstyle Data 7 aprilie 2017 20:42:30
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.07 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream f("trie.in");
ofstream g("trie.out");

struct Trie{
    int cnt, nrsons;
    Trie *son[26];
    Trie() //constructor
    {
        cnt = nrsons = 0;
        for (int i = 0; i <= 25; ++i)
            son[i] = 0;
    }
};
Trie *T = new Trie;


void insereaza(Trie * nod, char s[])
{
    if (*s < 'a' || *s > 'z') //daca aici se termina cuvantul
    {
        ++(nod -> cnt); //marcam
        return ;
    }
    if (nod -> son [(*s - 'a')] == 0) //daca n-am creat o prelungire pe litera s[curent]
    {
        nod -> son [(*s - 'a')] = new Trie; //cream si crestem nr de fii a nodului curent
        ++(nod -> nrsons);
    }
    insereaza (nod -> son[(*s - 'a')], s + 1); //continuam recursiv in inserare
}
int stergere(Trie * nod, char s[])
{
    if (*s < 'a' || *s > 'z') //daca aici se termina cuvantul
        --(nod -> cnt); //marcam stergerea invers fata de inserare
    else if (stergere(nod -> son[(*s - 'a')], s + 1)) //daca am sters in continuare
    {
        nod -> son[(*s - 'a')] = 0;
        --(nod -> nrsons);
    }
    if (nod -> cnt == 0 && nod -> nrsons == 0 && nod != T)
    {
        delete nod;
        return 1;
    }
    return 0;
}

int query_aparitii(Trie * nod, char s[])
{
    if (*s < 'a' || *s > 'z') //daca aici se termina cuvantul
        return nod -> cnt;
    if (nod -> son[(*s - 'a')])
        return query_aparitii(nod -> son[(*s - 'a')], s + 1);
    return 0;
}
int longest_prefix(Trie * nod, char s[], int k)
{
    if ((*s < 'a' || *s > 'z') || nod -> son[(*s - 'a')] == 0)
        return k;
    return longest_prefix(nod -> son[(*s - 'a')], s + 1, k + 1);
}

int main()
{
    char line[50];
    while (f.getline(line, 35))
    {
        if (line[0] == '0')
            insereaza(T, line + 2);
        if (line[0] == '1')
            stergere(T, line + 2);
        if (line[0] == '2')
            g << query_aparitii(T, line + 2) << "\n";
        if (line[0] == '3')
            g << longest_prefix(T, line + 2, 0) << "\n";
    }
}