Cod sursa(job #2883489)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 1 aprilie 2022 15:56:28
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <iostream>
#include <fstream>

using namespace std;

const string filename = "trie";
ifstream fin(filename + ".in");
ofstream fout(filename + ".out");

const int sigma = 26;
char s[25];

struct trie {
    int cnt, nr;
    trie* nxt[sigma];
    trie()
    {
        cnt = 0;
        nr = 0;
        for(int i = 0; i < sigma; i++)
            nxt[i] = 0;
    }
};
trie *root = new trie;

void insert_trie(trie *nod, char *s)
{
    if(*s == NULL)
    {
        nod->cnt++;
        return;
    }
    int ind = *s - 'a';
    if(nod->nxt[ind] == 0)
    {
        nod->nxt[ind] = new trie;
        nod->nr++;
    }
    insert_trie(nod->nxt[ind], s + 1);
}

bool delete_trie(trie *nod, char *s)
{
    if(*s == NULL)
        nod->cnt--;
    else
    {
        int ind = *s - 'a';
        if(delete_trie(nod->nxt[ind], s + 1))
        {
            nod->nxt[ind] = 0;
            nod->nr--;
        }
    }
    if(nod->cnt == 0 && nod->nr == 0 && nod != root)
        return 1;
    return 0;
}

int query_trie(trie *nod, char *s)
{
    if(*s == NULL)
        return nod->cnt;
    int ind = *s - 'a';
    if(nod->nxt[ind])
        return query_trie(nod->nxt[ind], s + 1);
    return 0;
}

int prefix_trie(trie *nod, char *s, int len)
{
    if(*s == NULL)
        return len;
    int ind = *s - 'a';
    if(nod->nxt[ind] == 0)
        return len;
    return prefix_trie(nod->nxt[ind], s + 1, len + 1);
}

int main()
{
    int cer;
    while(fin >> cer >> (s + 1))
    {
        if(cer == 0)
            insert_trie(root, (s + 1));
        if(cer == 1)
            delete_trie(root, (s + 1));
        if(cer == 2)
            fout << query_trie(root, (s + 1)) << '\n';
        if(cer == 3)
            fout << prefix_trie(root, (s + 1), 0) << '\n';
    }
    return 0;
}