Cod sursa(job #2876095)

Utilizator raulandreipopRaul-Andrei Pop raulandreipop Data 22 martie 2022 22:30:57
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.77 kb
#include <iostream>
#include <fstream>

using namespace std;

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

struct trie {
    struct trie *child[28];
    int nrend;
    int paths;
};

trie *getnode()
{
    trie *par = new trie;
    par->nrend = 0;
    par->paths = 0;
    for (int i = 0; i < 26; i++)
    {
        par->child[i] = 0;
    }
    return par;
}

void insert(trie *root, string w)
{
    trie *curr = root;

    for (int i = 0; i < w.size(); i++)
    {
        int ind = w[i] - 'a';
        
        if (!curr->child[ind])
        {
            curr->child[ind] = getnode();
        }
        curr = curr->child[ind];
        curr->paths++;
    }
    curr->nrend++;
}

int src (trie *root, string w)
{
    trie *curr = root;

    for (int i = 0; i < w.size(); i++)
    {
        int ind = w[i] - 'a';
        if (!curr->child[ind]) return false;

        curr = curr->child[ind];
    }
    return curr->nrend;
}

void erase(trie *root, string w)
{
    trie *curr = root;
    trie *lastEnd = root;
    int ii = 0;
    for (int i = 0; i < w.size(); i++)
    {
        int ind = w[i] - 'a';
        if (!curr->child[ind]) {
            return;
        }

        curr = curr->child[ind];
        curr->paths--;
        
    }
    curr->nrend--;
    return;
    if (curr->nrend == 0) return;
    bool chd = 0;
    for (int i = 0; i < 26; i++)
    {
        if (curr->child[i]) {
            chd = 1;
            break;
        }
    }
    if (chd == 1){
        curr->nrend--;
       
        return;
    }
    if (ii != 0){
        curr->nrend--;
        if (curr->nrend == 0){
            curr = lastEnd;
            curr = curr->child[w[ii+1] - 'a'];
            curr = 0;
        }
        return;
    }
    curr->nrend--;
 //   root->child[w[0] - 'a'] = 0;
    return;
}

int maxPref(trie* root, string w)
{
    trie* curr = root;
    int mx = 0;
    for (int i = 0; i < w.size(); i++)
    {
        int ind = w[i] - 'a';
        if (!curr->child[ind]){
            if (curr->paths > 0)
            return i;
            else return mx;
        }
        curr = curr->child[ind];
        if (curr->paths > 0) mx = i + 1;
        else return mx;
    }
    return mx;
}

int main ()
{
    int op;
    string w;
    trie* root = getnode();

    while (in >> op)
    {
        if (op == 0)
        {
            in >> w;
            insert(root, w);
        }
        if (op == 1)
        {
            in >> w;
            erase(root, w);
        }
        if (op == 2)
        {
            in >> w;
            out << src(root, w) << '\n';
        }
        if (op == 3)
        {
            in >> w;
            out  << maxPref(root, w) << '\n';
        }
    }
}