Cod sursa(job #2998680)

Utilizator octavi26octavian octavi26 Data 9 martie 2023 20:28:28
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 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;
        memset( next, 0, sizeof(next) );
    }
};

string s;

void Add( Node *nod, int i )
{
    nod->ap++;
    if( i == s.size() )
    {
        nod->words++;
        return;
    }
    if( nod->next[ s[i] - 'a' ] == 0 )
    {
        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--;
        if( nod->words == 0 && nod->ap == 0 )
        {
            delete nod;
        }
        sters = 1;
        return;
    }
    Delete( nod->next[ s[i] - 'a' ], i+1, sters );
    if( sters )
        nod->next[ s[i] - 'a' ] = 0, nod->ap--;
    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;
    Node *root = new Node;
    while( fin >> task )
    {
        bool sters;
        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;
}