BoxerTC

Untitled

Mar 1st, 2015
307
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.38 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define sc( x ) scanf( "%d" , &x )
  5. #define REP( i , n ) for( int i = 0 ; i < n ; ++i )
  6. #define clr( t , val ) memset( t , val , sizeof( t ) )
  7.  
  8. #define pb push_back
  9. #define all( v ) v.begin() , v.end()
  10. #define SZ( v ) ((int)(v).size())
  11.  
  12. #define fi first
  13. #define se second
  14. #define mp make_pair
  15.  
  16. #define N 1000000
  17. #define B 4LL
  18. #define MOD1 1000000007LL
  19. #define MOD2 1000000009LL
  20.  
  21. typedef long long ll;
  22. typedef vector< int > vi;
  23. typedef pair< int , int > pii;
  24. typedef pair< ll , ll > pll;
  25. typedef vector< pii > vpii;
  26. typedef vector< pll > vpll;
  27.  
  28. void format( string &s ){
  29.     REP( i , SZ( s ) ) s[ i ] -= 'a' , s[ i ] ++ ;
  30. }
  31. pll getHash( string s ){
  32.     ll H1 = 0 , H2 = 0;
  33.     REP( i , SZ( s ) ){
  34.         H1 = ( H1 * B + s[ i ] )%MOD1;
  35.         H2 = ( H2 * B + s[ i ] )%MOD2;
  36.     }
  37.     return mp( H1 , H2 );
  38. }
  39. ll POT1[ N + 5 ] , POT2[ N + 5 ];
  40. ll table1[ N + 5 ] , table2[ N + 5 ];
  41. ll fix( ll x , ll mod ){
  42.     return (x %mod + mod) %mod;
  43. }
  44. ll f1( int lo , int hi ){
  45.     if( lo > hi ) return 0;
  46.     return fix(table1[ hi + 1 ] - table1[ lo ] * POT1[ hi - lo +1 ] , MOD1 );
  47. }
  48. ll f2( int lo , int hi ){
  49.     if( lo > hi ) return 0;
  50.     return fix(table2[ hi + 1 ] - table2[ lo ] * POT2[ hi - lo +1 ] , MOD2 );
  51. }
  52. int main(){
  53.     POT1[ 0 ] = POT2[ 0 ] = 1;
  54.     for( int i = 1 ; i <= N ; ++i ){
  55.         POT1[ i ] = ( POT1[ i - 1 ] * B )%MOD1;
  56.         POT2[ i ] = ( POT2[ i - 1 ] * B )%MOD2;
  57.     }
  58.     ios_base :: sync_with_stdio( 0 );
  59.     int n , m;
  60.     while( cin >> n >> m ){
  61.         vpll vec;
  62.         REP( i , n ){
  63.             string s;
  64.             cin >> s;
  65.             format( s );
  66.             vec.pb( getHash( s ) );
  67.         }
  68.         sort( all( vec ) );
  69.         REP( it , m ){
  70.             string s;
  71.             cin >> s;
  72.             format( s );
  73.             pll x = getHash( s );
  74.  
  75.             REP( i , SZ( s ) ){
  76.                 table1[ i + 1 ] = ( table1[ i ] * B + s[ i ] )%MOD1;
  77.                 table2[ i + 1 ] = ( table2[ i ] * B + s[ i ] )%MOD2;
  78.             }
  79.             bool found = 0;
  80.             REP( i , SZ( s ) ){
  81.                 for( ll j = 1 ; j <= 3 ; ++j ){
  82.                     if( j == s[ i ] ) continue;
  83.                     int len = SZ( s ) - 1 - (i + 1) + 1;
  84.                     ll H1 = ( f1( 0 , i - 1 ) * POT1[ len + 1 ] + f1( i + 1 , SZ( s ) - 1 ) + POT1[ len ] * j )%MOD1;
  85.                     ll H2 = ( f2( 0 , i - 1 ) * POT2[ len + 1 ] + f2( i + 1 , SZ( s ) - 1 ) + POT2[ len ] * j )%MOD2;
  86.                     x = mp( H1 , H2 );
  87.                     if( binary_search( all( vec ) , x ) ){
  88.                         found = 1;
  89.                         break;
  90.                     }
  91.                 }
  92.             }
  93.             if( found ) cout << "YES\n";
  94.             else cout << "NO\n";
  95.         }
  96.     }  
  97. }
Advertisement
Add Comment
Please, Sign In to add comment