
Untitled
By: a guest on
May 5th, 2012 | syntax:
C++ | size: 1.65 KB | hits: 12 | expires: Never
#include <cstdio>
#include <algorithm>
using namespace std;
int n, Q;
char s[1001];
char out[1001];
struct node {
node *son, *bro;
int p, maks;
char c;
node() {
son = bro = 0;
p = maks = -2000000000;
}
};
void insert( node *root, char *s, int p ) {
root->maks = max( root->maks, p );
if( *s == 0 ) {
root->p = max( root->p, p );
return;
}
if( root->son == 0 ) {
root->son = new node;
root->son->c = *s;
}
for( node *n = root->son; n; n = n->bro ) {
if( n->c == *s ) {
insert( n, s+1, p );
return;
}
}
node *n = root->son;
while( n->bro ) n = n->bro;
n->bro = new node;
n = n->bro;
n->c = *s;
insert( n, s+1, p );
}
void query( node *root, char *s, int d ) {
if( *s == 0 && root->p == root->maks ) {
out[d] = 0;
puts( out );
return;
}
for( node *n = root->son; n; n = n->bro ) {
if( n->c == *s ) {
out[d] = *s;
query( n, s+1, d+1 );
return;
}
}
if( *s == 0 ) {
for( node *n = root->son; n; n = n->bro ) {
if( n->maks == root->maks ) {
out[d] = n->c;
query( n, s, d+1 );
return;
}
}
}
puts( "NO" );
}
int main( void ) {
scanf( "%d", &n );
node *root = new node;
for( int i = 0; i < n; ++i ) {
int p;
scanf( "%s%d", s, &p );
insert( root, s, p );
}
scanf( "%d", &Q );
for( int i = 0; i < Q; ++i ) {
scanf( "%s", s );
query( root, s, 0 );
}
return 0;
}