Cod sursa(job #3137677)

Utilizator cosminqfDanciu Cosmin Alexandru cosminqf Data 14 iunie 2023 12:49:48
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <bits/stdc++.h>
using namespace std;

/**
0 w - adauga w
1 w - sterge w din lista
2 w - nr ap ale lui w in lista
3 w - cel mai lung prefix w cu
      oricare cuvant din lista

*/
ifstream fin("trie.in");
ofstream fout("trie.out");

struct Trie
{
    Trie *leg[26];
    int fr, nrcuv;
    Trie()
    {
        fr = nrcuv = 0;
        for (int i = 0; i < 26; i++)
            leg[i] = NULL;
    }
};
Trie *rad;

void Op0(char w[])
{
    int j;
    Trie *p, *q;
    p = rad;
    p->nrcuv ++;
    for (int i = 0; w[i] != 0; i++)
    {
        j = w[i] - 'a';
        if (p->leg[j] != NULL)
            p = p->leg[j];
        else
        {
            q = new Trie;
            p->leg[j] = q;
            p = q;
        }
        p->nrcuv ++;
    }
    p->fr ++;
}

void Op1(char w[])
{
    int j;
    Trie *p;
    p = rad;
    p->nrcuv --;
    for (int i = 0; w[i] != 0; i++)
    {
        j = w[i] - 'a';
        p = p->leg[j];
        p->nrcuv --;
    }
    p->fr --;
}

void Op2(char w[])
{
    int j;
    Trie *p;
    p = rad;
    for (int i = 0; w[i] != 0; i++)
    {
        j = w[i] - 'a';
        p = p->leg[j];
    }
    fout << p->fr << "\n";
}

int Op3(char w[])
{
    int j, len = 0;
    Trie *p;
    p = rad;
    for (int i = 0; w[i] != 0; i++)
    {
        j = w[i] - 'a';
        if (p->leg[j] == NULL)
            return len;
        p = p->leg[j];
        if (p->nrcuv == 0)
            return len;
        len++;
    }
    return len;
}

int main()
{
    int op;
    char w[21];
    rad = new Trie;
    while (fin >> op >> w)
    {
        if (op == 0) Op0(w);
        else if (op == 1) Op1(w);
        else if (op == 2) Op2(w);
        else fout << Op3(w) << "\n";
    }
    return 0;
}