Cod sursa(job #1244966)

Utilizator gerd13David Gergely gerd13 Data 18 octombrie 2014 14:30:36
Problema Seif Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <fstream>
#include <algorithm>
#include <string>
#include <cstring>
#include <stdio.h>

using namespace std ;

const int NMAX = 1005 ;


const char *fisier = "seif.in";
const char *fisier_out = "seif.out";


int T, K;
char S[5][NMAX] ;
short best[NMAX][NMAX], D[5][NMAX][26], lungime[5] ;

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

int main()
{

freopen(fisier, "r", stdin);
freopen(fisier_out,  "w", stdout);
   scanf( "%d", &T) ;

    while(T -- )
    {

       scanf( "%d", &K) ;

        scanf( "%s", S[0]) ;
        scanf("%s", S[1]) ;

        for(short i = 0 ; i < 2 ; ++ i)
            lungime[i] = strlen(S[i]) ;

        memset(D, -1, sizeof(D)) ;

        for(int i = 0 ; i < 2 ; ++ i)
            for(int j = lungime[i] - 1 ; j >= 0 ;  -- j)
                for(int k = 0 ; k <= 26 ; ++ k)
                {
                    D[i][j][k] = D[i][j + 1][k] ;
                    D[i][j][S[i][j] - 'A'] = j ;

                }

        memset(best, 0, sizeof(best)) ;

        for(int i = lungime[0] - 1 ; i >= 0 ; -- i)
            for(int j = lungime[1] - 1 ; j >= 0 ; -- j)
                best[i][j] = (S[0][i] == S[1][j] ? best[i + 1][j + 1] + 1 : max(best[i + 1][j], best[i][j + 1])) ;

        for(int A[ ] = {-1, -1}, stop = 1 ; stop; )
        {
            stop = 0 ;
            for(int i = 25 ; i >= 0 && stop == 0; -- i)
            {
                int B[ ] = {0, 0} ;
                for(int j = 0 ; j < 2 ; ++ j)
                    B[j] = D[j][A[j] + 1][i] ;
                if(B[0] == -1 || B[1] == -1)
                    continue ;
                if(best[B[0]][B[1]] >= K)
                {
                   printf( "%c", i + 'A') ;
                    memcpy(A, B, sizeof(B)) ;
                    stop = 1 ;
                    -- K ;


                }

            }
        }
 printf( "\n") ;
    }
    return 0 ;
}