BoxerTC

Untitled

Apr 2nd, 2015
328
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.29 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 mp make_pair
  13. #define fi first
  14. #define se second
  15.  
  16. #define N 2000
  17. #define M 200
  18. #define INF (1LL<<50)
  19.  
  20. typedef vector< int > vi;
  21. typedef long long ll;
  22. typedef pair< int , int > pii;
  23.  
  24. int n , m , L;
  25. string a , b;
  26. bool used[ N + 5 ][ N + 5 ];
  27. ll memo[ N + 5 ][ N + 5 ];
  28. ll C[ M + 5 ][ M + 5 ];
  29.  
  30. ll G1[ M + 5 ][ M + 5 ];
  31. ll G2[ M + 5 ][ M + 5 ];
  32. ll I1[ M + 5 ][ M + 5 ];
  33. ll I2[ M + 5 ][ M + 5 ];
  34. ll get1( int c , int forb , ll &ind ){
  35.     if( G1[ c ][ forb ] != -1 ){
  36.         ind = I1[ c ][ forb ];
  37.         return G1[ c ][ forb ];
  38.     }
  39.     ll mini = INF;
  40.     REP( i , L ) if( i != forb ) {
  41.         if( C[ c ][ i ] < mini ){
  42.             mini = C[ c ][ i ];
  43.             ind = i;
  44.         }
  45.     }
  46.     G1[ c ][ forb ] = mini;
  47.     I1[ c ][ forb ] = ind;
  48.     return mini;
  49. }
  50. ll get2( int c , int forb , ll &ind ){
  51.     if( G2[ c ][ forb ] != -1 ){
  52.         ind = I2[ c ][ forb ];
  53.         return G2[ c ][ forb ];
  54.     }
  55.     ll mini = INF;
  56.     REP( i , L ) if( i != forb ){
  57.         if( C[ i ][ c ] < mini ){
  58.             mini = C[ i ][ c ];
  59.             ind = i;
  60.         }
  61.     }
  62.     G2[ c ][ forb ] = mini;
  63.     I2[ c ][ forb ] = ind;
  64.     return mini;
  65. }
  66. ll dp( int x , int y ){
  67.     //cout << x << " " << y << endl;
  68.     if( x == n && y == m ) return 0;
  69.     if( used[ x ][ y ] ) return memo[ x ][ y ];
  70.     used[ x ][ y ] = 1;
  71.     ll ind;
  72.     ll &dev = memo[ x ][ y ] = INF;
  73.     if( y < m ) dev = min( dev , get2( b[ y ] , (x < n) ? a[ x ] : L , ind ) + dp( x , y + 1 ) );
  74.     if( x < n ) dev = min( dev , get1( a[ x ] , (y < m) ? b[ y ] : L , ind ) + dp( x + 1 , y ) );  
  75.     if( x < n && y < m ) dev = min( dev , C[ a[ x ] ][ b[ y ] ] + dp( x + 1 , y + 1 ) );
  76.     return dev;
  77. }
  78. vector< int > sol1 , sol2;
  79. void rec( int x , int y ){
  80.     if( x == n && y == m ) return ;
  81.     ll ind;
  82.     if( y < m ) {
  83.         if( dp(x , y) == get2( b[ y ] , (x < n) ? a[ x ] : L ,  ind ) + dp( x , y + 1 ) ){
  84.             sol1.pb( ind );
  85.             sol2.pb( b[ y ] );
  86.             rec( x , y + 1 );
  87.             return;    
  88.         }
  89.     }
  90.     if( x < n ){
  91.         if( dp(x , y) == get1( a[ x ] , (y < m) ? b[ y ] : L , ind ) + dp( x + 1 , y ) ){
  92.             sol1.pb( a[ x ] );
  93.             sol2.pb( ind );        
  94.             rec( x + 1 , y );
  95.             return;
  96.         }
  97.     }
  98.     if( x < n && y < m ){
  99.         if( dp( x , y ) == C[ a[ x ] ][ b[ y ] ] + dp( x + 1 , y + 1 ) ){
  100.             sol1.pb( a[ x ] );
  101.             sol2.pb( b[ y ] );
  102.             rec( x + 1 , y + 1 );
  103.             return;
  104.         }
  105.     }
  106. }
  107. int main(){
  108.     /*
  109.     freopen( "dissim.in" , "r" , stdin );
  110.     freopen( "dissim.out" , "w" , stdout );
  111.     */
  112.     string alp;
  113.     while( cin >> alp ){
  114.         getline( cin , a );
  115.         getline( cin , a );
  116.         getline( cin , b );
  117.         vector< int > mapa( 1000 );
  118.         REP( i , SZ( alp ) ) mapa[ alp[ i ] ] = i;
  119.         REP( i , SZ( a ) ) a[ i ] = mapa[ a[ i ] ];
  120.         REP( i , SZ( b ) ) b[ i ] = mapa[ b[ i ] ];
  121.        
  122.         n = SZ( a );
  123.         m = SZ( b );
  124.         L = SZ( alp );
  125.         REP( i , L ) REP( j , L ) cin >> C[ i ][ j ];
  126.        
  127.         clr( G1 , -1 );
  128.         clr( G2 , -1 );
  129.         clr( I1 , -1 );
  130.         clr( I2 , -1 );
  131.        
  132.         clr( used , 0 );
  133.         printf( "%I64d\n" , dp( 0 , 0 ) );
  134.         sol1.clear() , sol2.clear();
  135.         rec( 0 , 0 );
  136.         REP( i , SZ( sol1 ) ) printf( "%c" , alp[ sol1[ i ] ] );
  137.         puts( "" );
  138.         REP( i , SZ( sol2 ) ) printf( "%c" , alp[ sol2[ i ] ] );
  139.         puts( "" );
  140.        
  141.     }
  142. }
Advertisement
Add Comment
Please, Sign In to add comment