Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define sc( x ) scanf( "%d" , &x )
- #define REP( i , n ) for( int i = 0 ; i < n ; ++i )
- #define clr( t , val ) memset( t , val , sizeof( t ) )
- #define pb push_back
- #define all( v ) v.begin() , v.end()
- #define SZ( v ) ((int)(v).size())
- #define mp make_pair
- #define fi first
- #define se second
- #define N 2000
- #define M 200
- #define INF (1LL<<50)
- typedef vector< int > vi;
- typedef long long ll;
- typedef pair< int , int > pii;
- typedef vector< ll > vll;
- typedef vector< vll > vvll;
- int n , m , L;
- bool used[ N + 5 ][ N + 5 ];
- ll memo[ N + 5 ][ N + 5 ];
- vvll C , CT;
- int A[ N + 5 ] , B[ N + 5 ];
- int I[ 2 ][ M + 5 ];
- ll dp( int x , int y ){
- if( x == n && y == m ) return 0;
- if( used[ x ][ y ] ) return memo[ x ][ y ];
- used[ x ][ y ] = 1;
- ll &dev = memo[ x ][ y ] = INF;
- if( x < n ) dev = min( dev , C[ A[ x ] ][ I[ 0 ][ A[ x ] ] ] + dp( x + 1 , y ) );
- if( y < m ) dev = min( dev , C[ I[ 1 ][ B[ y ] ] ][ B[ y ] ] + dp( x , y + 1 ) );
- if( x < n && y < m ) dev = min( dev , C[ A[ x ] ][ B[ y ] ] + dp( x + 1 , y + 1 ) );
- return dev;
- }
- vi sol1 , sol2;
- void rec( int x , int y ){
- if( x == n && y == m ) return;
- if( x < n ) {
- if( dp( x , y ) == C[ A[ x ] ][ I[ 0 ][ A[ x ] ] ] + dp( x + 1 , y ) ){
- sol1.pb( A[ x ] );
- sol2.pb( I[ 0 ][ A[ x ] ] );
- rec( x + 1 , y );
- return;
- }
- }
- if( y < m ) {
- if( dp( x , y ) == C[ I[ 1 ][ B[ y ] ] ][ B[ y ] ] + dp( x , y + 1 ) ){
- sol1.pb( I[ 1 ][ B[ y ] ] );
- sol2.pb( B[ y ] );
- rec( x , y + 1 );
- return;
- }
- }
- if( x < n && y < m ) {
- if( dp( x , y ) == C[ A[ x ] ][ B[ y ] ] + dp( x + 1 , y + 1 ) ){
- sol1.pb( A[ x ] );
- sol2.pb( B[ y ] );
- rec( x + 1 , y + 1 );
- return;
- }
- }
- }
- int main(){
- freopen( "dissim.in" , "r" , stdin );
- freopen( "dissim.out" , "w" , stdout );
- string alp , a , b;
- while( getline( cin , alp ) ){
- getline( cin , a );
- getline( cin , b );
- map< int , int > mapa;
- REP( i , SZ( alp ) ) mapa[ alp[ i ] ] = i;
- REP( i , SZ( a ) ) A[ i ] = mapa[ a[ i ] ];
- REP( i , SZ( b ) ) B[ i ] = mapa[ b[ i ] ];
- n = SZ( a );
- m = SZ( b );
- L = SZ( alp );
- C = vvll( L , vll( L ) ) , CT = C;
- REP( i , L ) REP( j , L ) cin >> C[ i ][ j ];
- REP( i , L ) REP( j , L ) CT[ i ][ j ] = C[ j ][ i ];
- REP( i , L ) I[ 0 ][ i ] = min_element( all( C[ i ] ) ) - C[ i ].begin();
- REP( i , L ) I[ 1 ][ i ] = min_element( all( CT[ i ] ) ) - CT[ i ].begin();
- clr( used , 0 );
- printf( "%I64d\n" , dp( 0 , 0 ) );
- sol1.clear() , sol2.clear();
- rec( 0 , 0 );
- REP( i , SZ( sol1 ) ) printf( "%c" , alp[ sol1[ i ] ] );
- puts( "" );
- REP( i , SZ( sol2 ) ) printf( "%c" , alp[ sol2[ i ] ] );
- puts( "" );
- return 0;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment