Pagini recente » Urmasii lui Moisil 2015, Clasament Clasa a 9-a | Cod sursa (job #112971) | Cod sursa (job #1284238) | Cod sursa (job #2577881) | Cod sursa (job #2637584)
/*
* 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 ;
}