Cod sursa(job #3242045)

Utilizator AlexanderCernyCernaianu Alexandru AlexanderCerny Data 8 septembrie 2024 11:09:29
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <iostream>
#include <fstream>
#define DIM 1000001
#include <cstring>

using namespace std;

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

struct nod
{
    int prefix;
    int cuvant;
    int fr[27];
}trie[DIM];
char s[21];
int op;
int cnt,sol;
void inserare(int nod, char s[21])
{
    trie[nod].prefix++;
    if(s[0]==0)
    {
        trie[nod].cuvant++;
        return;
    }
    if(trie[nod].fr[s[0]-'a'])
    {
        inserare(trie[nod].fr[s[0]-'a'], s+1);
    }
    else
    {
        cnt++;
        trie[nod].fr[s[0]-'a']=cnt;
        inserare(cnt,s+1);
    }
}
void stergere(int nod, char s[21])
{
    trie[nod].prefix--;
    if(s[0]==0)
    {
        trie[nod].cuvant--;
        return;
    }
    else
    {
        stergere(trie[nod].fr[s[0]-'a'], s+1);
    }
}
void prefix(int nod, int lg, char s[21])
{
    if(trie[nod].prefix>0){
        sol=lg;
    if(s[0]==0)
        return;

        if(trie[nod].fr[s[0]-'a'])
            prefix(trie[nod].fr[s[0]-'a'], lg+1, s+1);
        else
            return;
    }
}
int nrcuv(int nod, char s[21])
{
    if(s[0]==0)
        return trie[nod].cuvant;
    else
    {
        if(trie[nod].fr[s[0]-'a'])
            return nrcuv(trie[nod].fr[s[0]-'a'], s+1);
        else
            return 0;
    }
}
int main()
{
    while(fin>>op>>s)
    {
        if(op==0)
        {
            inserare(0,s);
        }
        else if(op==1)
        {
            stergere(0,s);
        }
        else if(op==3)
        {
            prefix(0,0,s);
            fout<<sol<<'\n';
        }
        else
        {
            fout<<nrcuv(0,s)<<'\n';
        }
        ///fout<<"Sir->"<<s<<'\n';
    }
    return 0;
}