Cod sursa(job #2044492)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 21 octombrie 2017 10:39:03
Problema Seif Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <bits/stdc++.h>

const int MAXN = (int) 1e3;
const int SIGMA = 26;

char A[MAXN + 1], B[MAXN + 1];

int dp[MAXN + 2][MAXN + 2];

std::vector <int> inda[SIGMA], indb[SIGMA];

std::vector <char> sol;

inline int get_next(std::vector <int> ind, char ch, int pos) {
    int rez = -1;
    for(int pas = 1 << 9; pas; pas >>= 1)
        if(rez + pas < ind.size() && ind[rez + pas] <= pos)
            rez += pas;
    rez++;
    if(rez == ind.size())
        return -1;
    return ind[rez];
}

int main() {
    FILE *fi, *fout;
    int t, i, j, n, m, k;
    char ch;
    fi = fopen("seif.in" ,"r");
    fout = fopen("seif.out" ,"w");
    fscanf(fi,"%d " ,&t);
    while(t > 0) {
       t--;
       fscanf(fi,"%d " ,&k);
       fscanf(fi,"%s %s " , A + 1, B + 1);
       n = strlen(A + 1);
       m = strlen(B + 1);
       memset(dp, 0, sizeof(dp));
       for(i = n; i >= 1; i--) {
          for(j = m; j >= 1; j--) {
             if(A[i] == B[j])
                dp[i][j] = dp[i + 1][j + 1] + 1;
             else
                dp[i][j] = std::max(dp[i + 1][j], dp[i][j + 1]);
          }
       }
       for(i = 0; i < SIGMA; i++) {
           inda[i].clear();
           indb[i].clear();
       }
       for(i = 1; i <= n; i++)
          inda[A[i] - 'A'].push_back(i);
       for(i = 1; i <= m; i++)
          indb[B[i] - 'A'].push_back(i);
       sol.clear();
       int posa = 0, posb = 0;
       while(1) {
          for(ch = 25; ch >= 0; ch--) {
             int pa = get_next(inda[ch], ch, posa), pb = get_next(indb[ch], ch, posb);
             if(pa > -1 && pb > -1 && dp[pa][pb] >= k) {
                posa = pa;
                posb = pb;
                k--;
                sol.push_back(ch + 'A');
                break;
             }
          }
          if(ch == -1)
             break ;
       }
       for(auto it : sol)
          fputc(it, fout);
       fputc('\n', fout);
    }
    fclose(fi);
    fclose(fout);
    return 0;
}