Cod sursa(job #134639)

Utilizator MariusMarius Stroe Marius Data 11 februarie 2008 23:20:34
Problema Seif Scor 100
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(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;
}