Cod sursa(job #1744233)

Utilizator Athena99Anghel Anca Athena99 Data 19 august 2016 14:54:32
Problema Seif Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include <fstream>
#include <string>

using namespace std;

ifstream fin("seif.in");
ofstream fout("seif.out");

const int nmax= 1000;
const int sigma= 26;

int d[nmax+2][nmax+2], p1[nmax+2][sigma], p2[nmax+2][sigma];

int main(  ) {
    int t;
    fin>>t;
    for ( int cnt= 1; cnt<=t; ++cnt ) {
        int k;
        string a, b;
        fin>>k>>a>>b;

        for ( int i= 0; i<=(int)a.size()+1; ++i ) {
            for ( int j= 0; j<=(int)b.size()+1; ++j ) {
                d[i][j]= 0;
            }
        }
        for ( int i= 0; i<=(int)a.size()+1; ++i ) {
            for ( int j= 0; j<sigma; ++j ) {
                p1[i][j]= 0;
            }
        }
        for ( int i= 0; i<=(int)b.size()+1; ++i ) {
            for ( int j= 0; j<sigma; ++j ) {
                p2[i][j]= 0;
            }
        }

        for ( int i= (int)a.size(); i>=1; --i ) {
            for ( int j= (int)b.size(); j>=1; --j ) {
                if ( a[i-1]==b[j-1] ) {
                    d[i][j]= d[i+1][j+1]+1;
                } else {
                    d[i][j]= max(d[i+1][j], d[i][j+1]);
                }
            }
        }

        for ( int i= (int)a.size(); i>=1; --i ) {
            for ( int j= 0; j<sigma; ++j ) {
                p1[i][j]= p1[i+1][j];
            }
            p1[i][a[i-1]-'A']= i;
        }
        for ( int i= (int)b.size(); i>=1; --i ) {
            for ( int j= 0; j<sigma; ++j ) {
                p2[i][j]= p2[i+1][j];
            }
            p2[i][b[i-1]-'A']= i;
        }

        for ( int i= 1, j= 1, ok= 1; ok==1 && ((i<=(int)a.size() && j<=(int)b.size()) || k>=0); --k ) {
            ok= 0;
            for ( int o= sigma-1; o>=0 && ok==0; --o ) {
                if ( d[p1[i][o]][p2[j][o]]>=k && p1[i][o]>0 && p2[j][o]>0 ) {
                    i= p1[i][o]+1, j= p2[j][o]+1;
                    ok= 1;
                    fout<<(char('A'+o));
                }
            }
        }

        fout<<"\n";
    }

    return 0;
}