Pagini recente » Cod sursa (job #2938259) | Cod sursa (job #2846970) | Cod sursa (job #1581312) | Cod sursa (job #1894568) | Cod sursa (job #134430)
Cod sursa(job #134430)
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
const char iname[] = "seif.in";
const char oname[] = "seif.out";
#define MAXN 1005
int L[MAXN][MAXN];
int first1[MAXN][26], first2[MAXN][26];
int work(string A, string B)
{
int n = (int)A.size();
int m = (int)B.size();
for (int i = 0; i < n; ++ i)
L[i][m] = 0;
for (int j = 0; j < m; ++ j)
L[n][j] = 0;
L[n][m] = 0;
for (int i = n - 1; i >= 0; -- i)
for (int j = m - 1; j >= 0; -- j)
if (A[i] == B[j])
L[i][j] = L[i + 1][j + 1] + 1;
else
L[i][j] = max(L[i][j + 1], L[i + 1][j]);
return L[0][0];
}
void workfirst(string A, int first[][26])
{
int n = (int)A.size();
for (int j = 0; j < 26; ++ j)
first[n][j] = n;
for (int i = n - 1; i >= 0; -- i)
for (int j = 0; j < 26; ++ j)
first[i][j] = (A[i] == 'A' + j) ? i : first[i + 1][j];
}
string worksubstr(int length)
{
string ret;
int i, j;
ret.clear();
i = j = 0;
for (; length > 0; -- length)
{
for (int litera = 25; litera >= 0; -- litera)
if (L[ first1[i][litera] ][ first2[j][litera] ] >= length)
{
i = first1[i][litera] + 1;
j = first2[j][litera] + 1;
ret.push_back(litera + 'A');
break ;
}
}
return ret;
}
int main(void)
{
ifstream fin(iname);
ofstream fout(oname);
string A, B, ret;
int css;
int K;
for (fin >> css; css > 0; -- css)
{
fin >> K;
fin >> A >> B;
int maxlensubstr = work(A, B);
workfirst(A, first1);
workfirst(B, first2);
ret.clear();
for (int lensubstr = K; lensubstr <= maxlensubstr; ++ lensubstr)
{
string temp = worksubstr(lensubstr);
if (ret.empty() || lexicographical_compare(ret.begin(), ret.end(), temp.begin(), temp.end()))
ret = temp;
}
fout << ret << '\n';
}
fin.close();
fout.close();
return 0;
}