Pagini recente » Cod sursa (job #1988912) | Cod sursa (job #3038132) | Cod sursa (job #2529260) | Cod sursa (job #2599457) | Cod sursa (job #1823061)
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LMAX 50
using namespace std;
char s [ LMAX ];
struct TRIE{
int cnt , nrfii ;
TRIE *fiu[26];
TRIE(){
cnt = nrfii = 0 ;
for ( int i = 0 ; i < 26 ; i++ ){
fiu [i] = NULL;
}
}
};
TRIE *t = new TRIE ;
void add(int k, TRIE *x ){
if ( s [ k ] == 0 ){
x -> cnt ++ ;
return ;
}
if ( x->fiu [ s[k] - 'a' ] == 0 ){
x ->fiu [ s [k] - 'a' ] = new TRIE ;
x->nrfii ++ ;
}
add( k+1 , x -> fiu[ s[k] - 'a' ] );
}
bool eras ( int k , TRIE *x ){
if ( s [ k ] == 0 ){
x->cnt -- ;
}else if ( eras( k + 1 , x->fiu [ s[k] - 'a' ] ) ){
x->nrfii --;
x->fiu [ s [k] - 'a' ] = 0;
}
if( x->cnt == 0 && x->nrfii == 0 && x != t ){
delete x;
return 1;
}
return 0 ;
}
int nrw ( int k , TRIE *x ){
if ( s[ k ] == 0 ){
return x->cnt;
}
if ( x->fiu [ s[ k ] - 'a' ] ) {
return nrw( k + 1 , x->fiu [ s[ k ] - 'a' ] );
}
return 0 ;
}
int premax ( int k , TRIE *x , int len ){
if ( x->fiu [ s [k]- 'a' ] == 0 || s[k] == 0 ){
return len;
}
return premax( k + 1 , x->fiu [ s [k]- 'a' ] , len + 1 );
}
int main(){
char ch;
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
while ( scanf( "%c", &ch ) == 1 ){
scanf( "%s", s );
if( ch == '0' ){
add( 0 , t );
}else if ( ch == '1' ){
eras( 0 , t );
}else if ( ch == '2' ){
printf("%d", nrw( 0 , t ) );
printf("\n");
}else {
printf("%d" , premax ( 0 , t , 0 ) );
printf("\n");
}
scanf("%c" , &ch );
}
return 0;
}