Cod sursa(job #2637584)

Utilizator Andrei-27Arhire Andrei Andrei-27 Data 23 iulie 2020 16:44:34
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.5 kb
/*
 *  Created by Andrei Arhire 23/07/2020
 *  Copyright © 2020 Andrei Arhire. All rights reserved.
 */
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define lll long long
#define llf __float128
#define lld long double
using namespace std;
const int NR = 5e4 + 10  ,oo = 1e9 + 10, MOD = 1e9 + 7 ;
const long double pi = 2*acos(0.0);


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

struct node {
    int token ;
    node *chr [ 26 ] ;
    node()  {
        for ( int i = 0 ; i < 26 ; ++ i )   {
            chr [ i ] = nullptr ;
        }
        token = 0 ;
    }
} *root ;

int tip ;
string s ;

void add () {
    node *curr = root ;
    for ( int i = 0 ; i < s.size() ; ++ i ) {
        if ( curr->chr[ s [ i ] - 'a' ] == nullptr )    {
            curr->chr [ s [ i ] - 'a' ] = new node ;
        }
        curr = curr->chr [ s [ i ] - 'a' ] ;
    }
    ++ curr->token ;
}


int sub ( node *curr , int i ) {
        int cnt = 0 ;
        if ( i != s.size() )    {
            if ( sub( curr->chr [ s [ i ] - 'a' ] , i + 1 ) )   {
                curr->chr [ s [ i ] - 'a' ] = nullptr ;
                delete curr->chr [ s [ i ] - 'a' ] ;
            }
        }
        if ( i == s.size() )    {
            -- curr->token ;
        }
        for ( int j = 0 ; j < 26 ; ++ j )   {
            if ( curr->chr [ j ] == nullptr )   {
                ++ cnt ;
            }
        }
        if ( cnt == 26 && curr->token == 0 )    {
            return 1 ;
        }
        return 0 ;
}


int count () {
    node *curr = root ;
    for ( int i = 0 ; i < s.size() ; ++ i ) {
        if ( curr->chr[ s [ i ] - 'a' ] == nullptr )    {
            return 0 ;
        }
        curr = curr->chr [ s [ i ] - 'a' ] ;
    }
    return curr->token ;
}


int length () {
    node *curr = root ;
    for ( int i = 0 ; i < s.size() ; ++ i ) {
        if ( curr->chr[ s [ i ] - 'a' ] == nullptr )    {
            return i ;
        }
        curr = curr->chr [ s [ i ] - 'a' ] ;
    }
    return s.size() ;
}


signed main () {
    int x , y , i ;
    ios::sync_with_stdio(0);
    in.tie(0);
    out.tie(0) ;
    root = new node ;
    while ( in >> tip )    {
        if ( tip == -1 )    return 0 ;
        in >> s ;
        if ( tip == 0 ) {
            add() ;
        }
        if ( tip == 1 ) {
            sub( root , 0 ) ;
        }
        if ( tip == 2 ) {
            out << count() << '\n' ;
        }
        if ( tip == 3 ) {
            out << length() << '\n' ;
        }
    }

    return 0 ;
}