Cod sursa(job #2966527)

Utilizator brianna_enacheEnache Brianna brianna_enache Data 17 ianuarie 2023 19:26:58
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include<fstream>
#define Q ( S[i] - 'a' )
#define ui unsigned int
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
    int end, son;
    Trie *F[26]; // Vector de adreselor fiilor
    Trie()
    {
        end=son=0;
        for(int i=0; i<26; i++) F[i]=0;
        //memset( F, 0, sizeof( F ) );
    }
};
Trie *T = new Trie;
string S;
void add(Trie *nod, ui i)
{
    if(i==S.length()) {nod->end++; return;}
    if(nod->F[Q]==0)
    {
        nod->F[Q]= new Trie; //Atribuirea unei adrese
        nod->son++;
    }
    add(nod->F[Q], i+1);
}
int del(Trie *nod, ui i)
{
    if(i==S.length()) nod->end--;
    else if( del(nod->F[Q], i+1 ) )
    {
        nod->F[Q] = 0;
        nod->son --;
    }
    if( nod->end == 0 && nod->son == 0 && nod != T )
    {
        delete nod; return 1;
    }
    return 0;
}
int query(Trie *nod, ui i)
{
    if(i==S.length()) return nod->end;
    if(nod->F[Q]) return query(nod->F[Q], i+1);
    return 0;
}
int prefix(Trie *nod, ui i, int k)
{
    if(i==S.length() || nod->F[Q]==0) return k;
    return prefix(nod->F[Q], i+1, k+1);
}
int main()
{
    int q;
    while(fin >> q)
    {
        fin >> S;
        switch(q)
        {
            case 0: add( T, 0); break;
            case 1: del( T, 0); break;
            case 2: fout << query( T, 0) << '\n'; break;
            case 3: fout << prefix( T, 0, 0) << '\n'; break;
        }
    }
    return 0;
}