Cod sursa(job #2720859)

Utilizator bogdi1bogdan bancuta bogdi1 Data 11 martie 2021 12:46:55
Problema Seif Scor 100
Compilator cpp-32 Status done
Runda Arhiva de probleme Marime 2 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int dp[1005][1005];
int nxt[2][1005][30];
char s[2][1005];
int main()
{   freopen("seif.in", "r", stdin);
    freopen("seif.out", "w", stdout);
    int t,k,n,m,i,j,l,i1,i2;
    scanf("%d", &t);
    while(t){
        scanf("%d\n", &k);
        scanf("%s", s[0]+1);
        scanf("%s", s[1]+1);
        n=strlen(s[0]+1);
        m=strlen(s[1]+1);
        for(i=n; i>=1; i--)
            for(j=m; j>=1; j--)
                if(s[0][i]==s[1][j])
                    dp[i][j]=dp[i+1][j+1]+1;
                else
                    dp[i][j]=max(dp[i+1][j], dp[i][j+1]);
        for(i=n-1; i>=0; i--){
            for(j=1; j<=26; j++)
                nxt[0][i][j]=nxt[0][i+1][j];
            nxt[0][i][s[0][i+1]-'A'+1]=i+1;
        }
        for(i=m-1; i>=0; i--){
            for(j=1; j<=26; j++)
                nxt[1][i][j]=nxt[1][i+1][j];
            nxt[1][i][s[1][i+1]-'A'+1]=i+1;
        }
        l=1;
        i1=0;
        i2=0;
        while(l<=k){
            for(j=26; j>=1; j--)
                if(nxt[0][i1][j]!=0 && nxt[1][i2][j]!=0 && dp[nxt[0][i1][j]][nxt[1][i2][j]]>=k-l+1){
                    i1=nxt[0][i1][j];
                    i2=nxt[1][i2][j];
                    printf("%c", j+'A'-1);
                    break;
                }
            l++;
        }
        do{
            for(j=26; j>=1; j--)
                if(nxt[0][i1][j]!=0 && nxt[1][i2][j]!=0){
                    i1=nxt[0][i1][j];
                    i2=nxt[1][i2][j];
                    printf("%c", j+'A'-1);
                    break;
            }
        }while(j!=0);
        printf("\n");
        for(i=1; i<=n; i++)
            for(j=1; j<=m; j++)
                dp[i][j]=0;
        for(i=1; i<=n; i++)
            for(j=1; j<=26; j++)
                nxt[0][i][j]=0;
        for(i=1; i<=m; i++)
            for(j=1; j<=26; j++)
                nxt[1][i][j]=0;
        t--;
    }
    return 0;
}