Cod sursa(job #2998687)

Utilizator octavi26octavian octavi26 Data 9 martie 2023 20:40:37
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <bits/stdc++.h>
#define N 2008

using namespace std;

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

struct Node
{
    int words;
    int ap;
    Node *next[27];
    Node(){
        words = 0;
        ap = 0;
        memset( next, 0, sizeof(next) );
    }
};

Node *root = new Node;
string s;

void Add( Node *nod, int i )
{
    if( i == s.size() )
    {
        nod->words++;
        return;
    }
    if( nod->next[ s[i] - 'a' ] == 0 )
    {
        nod->ap++;
        nod->next[ s[i] - 'a' ] = new Node;
    }
    Add( nod->next[ s[i] - 'a' ], i+1 );
}

void Delete( Node *nod, int i, bool &sters )
{
    if( i == s.size() )
    {
        nod->words--;
    }
    else
    {
        Delete( nod->next[ s[i] - 'a' ], i+1, sters );
        if( sters )
            nod->next[ s[i] - 'a' ] = 0, nod->ap--;
    }

    if( nod->words == 0 && nod->ap == 0 && nod != root )
    {
        delete nod;
        sters = 1;
    }
    else sters = 0;
}

int Search( Node *nod, int i )
{
    if( !nod ) return 0;
    if( i == s.size() )
        return nod->words;
    else
        return Search( nod->next[ s[i] - 'a' ], i+1 );
}

int Query( Node *nod, int i )
{
    if( i == s.size() )
        return i;
    if( nod->next[ s[i] - 'a' ] == 0 )
        return i;
    return Query( nod->next[ s[i] - 'a' ], i+1 );
}

void Citire()
{
    int task;
    while( fin >> task )
    {
        bool sters = 0;
        fin >> s;
        if( task == 0 )
            Add( root, 0 );
        if( task == 1 )
            Delete( root, 0, sters );
        if( task == 2 )
            fout << Search( root, 0 ) << "\n";
        if( task == 3 )
            fout << Query( root, 0 ) << "\n";
    }
}

void Rezolvare()
{
}

int main()
{
    Citire();
    Rezolvare();
    return 0;
}