Cod sursa(job #134424)

Utilizator MariusMarius Stroe Marius Data 11 februarie 2008 18:30:52
Problema Seif Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#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)
{
	for (int i = 0; i < (int)A.size(); ++ i)
		L[i][B.size()] = 0;
	for (int j = 0; j < (int)B.size(); ++ j)
		L[A.size()][j] = 0;
	L[A.size()][B.size()] = 0;
	for (int i = (int)A.size() - 1; i >= 0; -- i)
		for (int j = (int)B.size() - 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])
{
	for (int j = 0; j < 26; ++ j)
		first[A.size()][j] = (int)A.size();
	for (int i = (int)A.size() - 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 (lexicographical_compare(ret.begin(), ret.end(), temp.begin(), temp.end()))
				ret = temp;
		}
		fout << ret << '\n';
	}

	fin.close();
	fout.close();
	return 0;
}