Pagini recente » Cod sursa (job #2471743) | Cod sursa (job #1738500) | Cod sursa (job #643945) | Cod sursa (job #2029425) | Cod sursa (job #992215)
Cod sursa(job #992215)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <queue>
#include <deque>
using namespace std;
ifstream f("seif.in");
ofstream g("seif.out");
#define ll long long
#define pb push_back
#define mp make_pair
#define sz size
#define x first
#define y second
#define nmax 1005
#define sigma 27
#define inf (1<<29)
string A, B;
int nextA[nmax][sigma], nextB[nmax][sigma];
int K;
void citeste(){
f >> K;f.get();
getline(f, A);
getline(f, B);
}
void bagaNext(int next[nmax][sigma], string S, int n){
for(int i='A'-'A'; i<='Z'-'A'; ++i) next[n][i] = n;
for(int i=n-1; i>=0; --i){
for(int lit='A'-'A'; lit<='Z'-'A'; ++lit){
next[i][lit] = next[i+1][lit];
}
next[i][ S[i]-'A' ] = i;
}
}
void aflaSol(int cnt, int pozA, int pozB, int n, int m){
if (pozA != -1 && pozB != -1){
g << A[pozA];
}
for(int lit='Z'-'A'; lit>='A'-'A'; --lit){
int newPozA = nextA[pozA+1][lit];
int newPozB = nextB[pozB+1][lit];
if (newPozA == n || newPozB == m) continue;
if (cnt + min( n-newPozA, m-newPozB ) >= K ){
aflaSol(cnt+1, newPozA, newPozB, n, m);
break;
}
}
}
void preproces(){
int n = A.sz(); int m = B.sz();
bagaNext(nextA, A, n);
bagaNext(nextB, B, m);
aflaSol(0, -1, -1, n, m);
}
void rezolva(){
preproces();
}
int main(){
int t =0; f >> t;
for(; t; --t){
citeste();
rezolva();
g << "\n";
}
f.close();
g.close();
return 0;
}