Pagini recente » Rezultatele filtrării | Borderou de evaluare (job #2434218) | Borderou de evaluare (job #2633147) | Rezultatele filtrării | Cod sursa (job #396736)
Cod sursa(job #396736)
#include <algorithm>
using namespace std;
#define ALF 26
#define DIM 1<<9
struct punct {
int x, y;
};
char a[ DIM ], b[ DIM ];
int N, M, XXX;
int lsc[ DIM ][ DIM ], sol[ DIM ][ DIM ], uaa[ ALF ][ DIM ], uab[ ALF ][ DIM ];
punct xmx[ ALF ], ymx[ ALF ];
inline int max( const int &x, const int &y ) {
if( x > y )
return x;
return y;
}
void calc_lsc() {
int i, j;
for( i = 1; i <= N; ++i )
for( j = 1; j <= M; ++j )
if( a[ i ] == b[ j ] )
lsc[ i ][ j ] = lsc[ i-1 ][ j-1 ] + 1;
else
lsc[ i ][ j ] = max( lsc[ i-1 ][ j ], lsc[ i ][ j-1 ] );
}
void calc_uaa() {
char ch;
int i;
for( ch = 'a'; ch < ALF + 'a'; ++ch )
for( i = 1; i <= N; ++i ) {
uaa[ ch - 'a' ][ i ] = uaa[ ch - 'a'][ i-1 ];
if( a[ i ] == ch )
uaa[ ch - 'a' ][ i ] = i;
}
}
void calc_uab() {
char ch;
int i;
for( ch = 'a'; ch < ALF + 'a'; ++ch )
for( i = 1; i <= M; ++i ) {
uab[ ch - 'a' ][ i ] = uab[ ch - 'a'][ i-1 ];
if( b[ i ] == ch )
uab[ ch - 'a' ][ i ] = i;
}
}
void calc_sol() {
char ch;
int i, j, ii, jj;
for( i = 1; i <= N; ++i )
for( j = 1; j <= M; ++j )
if( a[ i ] == b[ j ] ) {
for( ch = 'a'; ch < ALF + 'a'; ++ch ) {
ii = uaa[ ch - 'a' ][ i-1 ];
jj = uab[ ch - 'a' ][ j-1 ];
if( lsc[ ii ][ jj ] + 1 == lsc[ i ][ j ] )
sol[ i ][ j ] += sol[ ii ][ jj ];
}
if( !sol[ i ][ j ] && lsc[ i ][ j ] == lsc[ N ][ M ] )
sol[ i ][ j ] = 1;
}
}
int main() {
freopen( "subsir.in", "r", stdin );
freopen( "subsir.out", "w", stdout );
int i, j, aux;
gets( a+1 );
N = strlen( a+1 );
gets( b+1 );
M = strlen( b+1 );
calc_lsc();
// for( int i = 1; i <= N; ++i ) {
//
// for( int j = 1; j <= M; ++j )
// printf( "%d ", lsc[ i ][ j ] );
// printf( "\n" );
// }
calc_uaa();
// for( int i = 0; i < ALF; ++i ) {
//
// printf( "%c: ", i + 'a' );
// for( int j = 1; j <= N; ++j )
// printf( "%d ", uaa[ i ][ j ] );
// printf( "\n" );
// }
calc_uab();
// for( int i = 0; i < ALF; ++i ) {
//
// printf( "%c: ", i + 'a' );
// for( int j = 1; j <= M; ++j )
// printf( "%d ", uab[ i ][ j ] );
// printf( "\n" );
// }
calc_sol();
// for( int i = 1; i <= N; ++i ) {
//
// for( int j = 1; j <= M; ++j )
// printf( "%d ", sol[ i ][ j ] );
// printf( "\n" );
// }
for( i = 1; i <= N; ++i )
for( j = 1; j <= M; ++j )
if( sol[ i ][ j ] ) {
aux = a[ i ] - 'a';
if( i <= xmx[ aux ].x || j <= xmx[ aux ].y )
continue;
if( i <= ymx[ aux ].x || j <= ymx[ aux ].y )
continue;
XXX += sol[ i ][ j ];
if( i > xmx[ aux ].x ) {
xmx[ aux ].x = i;
xmx[ aux ].y = j;
}
if( j > ymx[ aux ].y ) {
ymx[ aux ].x = i;
ymx[ aux ].y = j;
}
}
printf( "%d", XXX );
return 0;
}