Cod sursa(job #2003152)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 22 iulie 2017 01:25:25
Problema Seif Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <bits/stdc++.h>
using namespace std;

const int SIGMA = 26;
const int DIM = 1005;
const int EXP = 2;

char str[EXP][DIM]; int len[EXP];
int nxt[EXP][DIM][SIGMA], dp[DIM][DIM];

int main(void)
{
    freopen("seif.in" , "r", stdin );
    freopen("seif.out", "w", stdout);
    
    int t;
    scanf("%d", &t);
    
    while (t--) {
        int k;
        scanf("%d", &k);
    
        memset(nxt, 0, sizeof(nxt));
        for (int p = 0; p < 2; ++p) {
            scanf("%s", str[p]);
            len[p] = (int) strlen(str[p]);
            
            for (int j = 0; j < SIGMA; ++j)
                nxt[p][len[p]][j] = len[p];
            
            for (int i = len[p] - 1; i >= 0; --i) {
                memcpy(nxt[p][i], nxt[p][i + 1], SIGMA << 2);
                nxt[p][i][str[p][i] - 'A'] = i;
            }
        }
        
        memset(dp, 0, sizeof(dp));
        for (int i = len[0] - 1; i >= 0; --i) {
        for (int j = len[1] - 1; j >= 0; --j) {
            if (str[0][i] == str[1][j])
                dp[i][j] = 1 + dp[i + 1][j + 1];
            else
                dp[i][j] = max(dp[i + 1][j], dp[i][j + 1]);
        } }
        
        for (int i = -1, j = -1; k != 0; ) {
            for (int p = SIGMA - 1; p >= 0; --p) {
                if (dp[nxt[0][i + 1][p]][nxt[1][j + 1][p]] < k)
                    continue;
                
                i = nxt[0][i + 1][p];
                j = nxt[1][j + 1][p];
                
                printf("%c", p + 'A');
                k -= (dp[i][j] == k);
            
                break;
            }
        }
        
        printf("\n");
    }
    
    return 0;
}