BoxerTC

Untitled

Apr 2nd, 2015
340
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.87 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. typedef vector< ll > vll;
  24. typedef vector< vll > vvll;
  25.  
  26. int n , m , L;
  27. bool used[ N + 5 ][ N + 5 ];
  28. ll memo[ N + 5 ][ N + 5 ];
  29.  
  30. vvll C , CT;
  31.  
  32. int A[ N + 5 ] , B[ N + 5 ];  
  33. int I[ 2 ][ M + 5 ];
  34.  
  35. ll dp( int x , int y ){
  36.     if( x == n && y == m ) return 0;
  37.     if( used[ x ][ y ] ) return memo[ x ][ y ];
  38.     used[ x ][ y ] = 1;
  39.     ll &dev = memo[ x ][ y ] = INF;
  40.     if( x < n ) dev = min( dev , C[ A[ x ] ][ I[ 0 ][ A[ x ] ] ] + dp( x + 1 , y ) );
  41.     if( y < m ) dev = min( dev , C[ I[ 1 ][ B[ y ] ] ][ B[ y ] ] + dp( x , y + 1 ) );
  42.     if( x < n && y < m ) dev = min( dev , C[ A[ x ] ][ B[ y ] ] + dp( x + 1 , y + 1 ) );
  43.     return dev;
  44. }
  45. vi sol1 , sol2;
  46. void rec( int x , int y ){
  47.     if( x == n && y == m ) return;
  48.     if( x < n ) {
  49.         if( dp( x , y ) == C[ A[ x ] ][ I[ 0 ][ A[ x ] ] ] + dp( x + 1 , y ) ){
  50.             sol1.pb( A[ x ] );
  51.             sol2.pb( I[ 0 ][ A[ x ] ] );
  52.             rec( x + 1 , y );
  53.             return;
  54.         }
  55.     }
  56.     if( y < m ) {
  57.         if( dp( x , y ) == C[ I[ 1 ][ B[ y ] ] ][ B[ y ] ] + dp( x , y + 1 ) ){
  58.             sol1.pb( I[ 1 ][ B[ y ] ] );
  59.             sol2.pb( B[ y ] );
  60.             rec( x , y + 1 );
  61.             return;
  62.         }
  63.     }
  64.     if( x < n && y < m ) {
  65.         if( dp( x , y ) == C[ A[ x ] ][ B[ y ] ] + dp( x + 1 , y + 1 ) ){
  66.             sol1.pb( A[ x ] );
  67.             sol2.pb( B[ y ] );
  68.             rec( x + 1 , y + 1 );
  69.             return;
  70.         }
  71.     }
  72. }
  73.  
  74. int main(){
  75.    
  76.     freopen( "dissim.in" , "r" , stdin );
  77.     freopen( "dissim.out" , "w" , stdout );
  78.    
  79.     string alp , a , b;
  80.     while( getline( cin , alp ) ){
  81.         getline( cin , a );
  82.         getline( cin , b );
  83.         map< int , int > mapa;
  84.         REP( i , SZ( alp ) ) mapa[ alp[ i ] ] = i;
  85.         REP( i , SZ( a ) ) A[ i ] = mapa[ a[ i ] ];
  86.         REP( i , SZ( b ) ) B[ i ] = mapa[ b[ i ] ];
  87.        
  88.         n = SZ( a );
  89.         m = SZ( b );
  90.         L = SZ( alp );
  91.         C = vvll( L , vll( L ) ) , CT = C;
  92.         REP( i , L ) REP( j , L ) cin >> C[ i ][ j ];
  93.         REP( i , L ) REP( j , L ) CT[ i ][ j ] = C[ j ][ i ];
  94.         REP( i , L ) I[ 0 ][ i ] = min_element( all( C[ i ] ) ) - C[ i ].begin();
  95.         REP( i , L ) I[ 1 ][ i ] = min_element( all( CT[ i ] ) ) - CT[ i ].begin();
  96.        
  97.         clr( used , 0 );
  98.         printf( "%I64d\n" , dp( 0 , 0 ) );
  99.         sol1.clear() , sol2.clear();
  100.         rec( 0 , 0 );
  101.         REP( i , SZ( sol1 ) ) printf( "%c" , alp[ sol1[ i ] ] );
  102.         puts( "" );
  103.         REP( i , SZ( sol2 ) ) printf( "%c" , alp[ sol2[ i ] ] );
  104.         puts( "" );
  105.         return 0;
  106.     }
  107. }
Advertisement
Add Comment
Please, Sign In to add comment