Cod sursa(job #1244952)

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

using namespace std ;

const int NMAX = 1005 ;




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("seif.in", "r", stdin) ;
    freopen ("seif.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 ;
}