Cod sursa(job #1806308)

Utilizator dani_mocanuDani Mocanu dani_mocanu Data 15 noiembrie 2016 08:52:13
Problema Seif Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("seif.in");
ofstream fout("seif.out");
const int nmax = 1005;
char s1[nmax],s2[nmax];
int T,N,M,K,dp[nmax][nmax];
int nxt[2][nmax][30];

inline void Precalc()
{
    int i,j;
    for(i = 1; i <= N+1; i++)
        for(j = 1; j <= M+1; j++)
            dp[i][j] = 0;
    for(i = N; i >= 1; i--)
        for(j = M; j >= 1; j--)
            if(s1[i] == s2[j])
                dp[i][j] = 1 + dp[i+1][j+1];
            else dp[i][j] = max(dp[i+1][j],dp[i][j+1]);
    for(i = 0; i < 26; i++)
        nxt[0][N+1][i] = nxt[1][M+1][i] = nmax - 3;
    for(i = N; i >= 1; i--)
    {
        for(j = 0; j < 26; j++)
            nxt[0][i][j] = nxt[0][i+1][j];
        nxt[0][i][s1[i]-'A'] = i;
    }
    for(i = M; i >= 1; i--)
    {
        for(j = 0; j < 26; j++)
            nxt[1][i][j] = nxt[1][i+1][j];
        nxt[1][i][s2[i]-'A'] = i;
    }
}


inline void Solve()
{
    int p1,p2,j,ok,n1,n2;
    N = strlen(s1 + 1);
    M = strlen(s2 + 1);
    Precalc();
    p1 = p2 = 1;
    while(p1 <= N && p2 <= M)
    {

        ok = 0;
        for(j = 25;!ok && j >= 0; j--)
        {
            n1 = nxt[0][p1][j];
            n2 = nxt[1][p2][j];
            if(n1 <= N && n2 <= M && dp[n1][n2] >= K)
            {
                fout << s1[n1];
                ok = 1;
                p1 = n1 + 1; p2 = n2 + 1;
                K--;
            }
        }
        if(j == -1 && !ok) break;
    }
    fout << "\n";
}


int main()
{
    fin >> T;
    while(T--)
    {
        fin >> K;
        fin >> (s1 + 1);
        fin >> (s2 + 1);
        Solve();
    }
    fout.close();
    return 0;
}