Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 5th, 2012  |  syntax: C++  |  size: 1.65 KB  |  hits: 12  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. #include <cstdio>
  2.  
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. int n, Q;
  7. char s[1001];
  8. char out[1001];
  9.  
  10. struct node {
  11.    node *son, *bro;
  12.    int p, maks;
  13.    char c;
  14.  
  15.    node() {
  16.       son = bro = 0;
  17.       p = maks = -2000000000;
  18.    }
  19. };
  20.  
  21. void insert( node *root, char *s, int p ) {
  22.    root->maks = max( root->maks, p );
  23.    
  24.    if( *s == 0 ) {
  25.       root->p = max( root->p, p );
  26.       return;
  27.    }
  28.  
  29.    if( root->son == 0 ) {
  30.       root->son = new node;
  31.       root->son->c = *s;
  32.    }
  33.  
  34.    for( node *n = root->son; n; n = n->bro ) {
  35.       if( n->c == *s ) {
  36.          insert( n, s+1, p );
  37.          return;
  38.       }
  39.    }
  40.  
  41.    node *n = root->son;
  42.    while( n->bro ) n = n->bro;
  43.    
  44.    n->bro = new node;
  45.    n = n->bro;
  46.    n->c = *s;
  47.    insert( n, s+1, p );
  48. }
  49.  
  50. void query( node *root, char *s, int d ) {
  51.    if( *s == 0 && root->p == root->maks ) {
  52.       out[d] = 0;
  53.       puts( out );
  54.       return;
  55.    }
  56.  
  57.    for( node *n = root->son; n; n = n->bro ) {
  58.       if( n->c == *s ) {
  59.          out[d] = *s;
  60.          query( n, s+1, d+1 );
  61.          return;
  62.       }
  63.    }
  64.  
  65.    if( *s == 0 ) {
  66.       for( node *n = root->son; n; n = n->bro ) {
  67.          if( n->maks == root->maks ) {
  68.             out[d] = n->c;
  69.             query( n, s, d+1 );
  70.             return;
  71.          }
  72.       }
  73.    }
  74.  
  75.    puts( "NO" );
  76. }
  77.  
  78. int main( void ) {
  79.    scanf( "%d", &n );
  80.  
  81.    node *root = new node;
  82.    for( int i = 0; i < n; ++i ) {
  83.       int p;
  84.       scanf( "%s%d", s, &p );
  85.       insert( root, s, p );
  86.    }
  87.  
  88.    scanf( "%d", &Q );
  89.    for( int i = 0; i < Q; ++i ) {
  90.       scanf( "%s", s );
  91.       query( root, s, 0 );
  92.    }
  93.      
  94.    return 0;
  95. }