Pagini recente » Cod sursa (job #970864) | Cod sursa (job #2746844) | Cod sursa (job #2742779) | Cod sursa (job #38469) | Cod sursa (job #134639)
Cod sursa(job #134639)
#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(char A[], char B[])
{
int n = (int)strlen(A);
int m = (int)strlen(B);
for (int i = 0; i < n; ++ i)
L[i][m] = 0;
for (int j = 0; j < n; ++ 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(char A[], int first[][26])
{
int n = (int)strlen(A);
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]);
}
void worksubstr(char A[], char B[], int length, char ret[])
{
int i, j, ret_size = 0;
int n = (int)strlen(A);
int m = (int)strlen(B);
bool moved;
for (i = j = 0; i < n && j < m; )
{
moved = false;
for (int litera = 25; litera >= 0; -- litera)
{
int p1 = first1[i][litera];
int p2 = first2[j][litera];
if (L[p1][p2] >= length) if (p1 < n && p2 < m)
{
ret[ret_size ++] = litera + 'A';
i = p1 + 1;
j = p2 + 1;
moved = true;
break ;
}
}
if (length > 0) length --;
if (!moved) break ;
}
ret[ret_size] = 0;
}
int main(void)
{
ifstream fin(iname);
ofstream fout(oname);
char A[MAXN], B[MAXN], ret[MAXN];
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);
worksubstr(A, B, K, ret);
fout << ret << '\n';
}
fin.close();
fout.close();
return 0;
}