Cod sursa(job #1007099)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 8 octombrie 2013 11:49:51
Problema Seif Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include<stdio.h>
#include<cstring>

#define maxdim 1005
#define alfa 26

FILE*f=fopen("seif.in","r");
FILE*g=fopen("seif.out","w");

int n,m,k;
int D[maxdim][maxdim],next1[maxdim][alfa],next2[maxdim][alfa];
char A[maxdim],B[maxdim];

inline int max ( const int &a , const int &b ){
	return a >= b ? a : b;
}

inline void citire () {
	
	fscanf(f,"%d\n",&k);
	fscanf(f,"%s%s",A+1,B+1);
	n = strlen(A+1),m = strlen(B+1);
}

inline void cmlsc () {
	
	for ( int i = 1 ; i <= n+1 ; ++i ){
		for ( int j = 1 ; j <= m+1 ; ++j ){
			D[i][j] = 0;
		}
	}
	
	for ( int i = n ; i >= 1 ; --i ){
		for ( int j = m ; j >= 1 ; --j ){
			
			if ( A[i] == B[j] ){
				D[i][j] = D[i+1][j+1]+1;
			}
			else{
				D[i][j] = max(D[i+1][j],D[i][j+1]);
			}
		}
	}
}

inline void build_next () {
	
	for ( int j = 0 ; j < alfa ; ++j ){
		next1[n+1][j] = next2[m+1][j] = 0;
	}
	for ( int i = n ; i >= 1 ; --i ){
		
		for ( int j = 0 ; j < alfa ; ++j )	next1[i][j] = next1[i+1][j];
		next1[i][ A[i]-'A' ] = i;
	}
	for ( int i = m ; i >= 1 ; --i ){
		
		for ( int j = 0 ; j < alfa ; ++j )	next2[i][j] = next2[i+1][j];
		next2[i][ B[i]-'A' ] = i;
	}
}

inline void solve () {
	
	cmlsc();
	build_next();
	
	int x = 0,y = 0;
	for ( ; ; ){
		
		int found = 0;
		for ( int ch = alfa-1 ; ch >= 0 ; --ch ){
			int x2 = next1[x+1][ch],y2 = next2[y+1][ch];
			
			if ( x2 == 0 || y2 == 0 )	continue ;
			
			if ( D[x2][y2] >= k ){
				fprintf(g,"%c",ch+'A');
				--k; found = 1;
				x = x2,y = y2;
				break ;
			}
		}
		
		if ( !found )	break ;
	}
	fprintf(g,"\n");
}

int main () {
	
	int tests;
	fscanf(f,"%d",&tests);
	
	while ( tests-- ){
		
		citire();
		solve();
	}
	
	fclose(f);
	fclose(g);
	
	return 0;
}