Cod sursa(job #134297)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 11 februarie 2008 11:03:24
Problema Seif Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <stdio.h>
#include <string.h>

#define MAXN 1024

int K;
char s[2][MAXN]; int len[2];
int first[2][MAXN][32];

short Max[MAXN][MAXN];

int main()
{
	freopen("seif.in", "rt", stdin);
	freopen("seif.out", "wt", stdout);

	int T;
	scanf("%d", &T);

	for (; T; T--)
	{
		memset( s, 0, sizeof(s) );

		scanf("%d %s %s", &K, s[0], s[1]);
		len[0] = strlen( s[0] );
		len[1] = strlen( s[1] );

		memset( first, -1, sizeof(first) );

		for (int i = 0; i < 2; i++)
		{
			for (int j = len[i] - 1; j >= 0; j--)
			{
				for (int k = 0; k <= 'Z' - 'A'; k++)
					first[i][j][k] = first[i][j + 1][k];
				first[i][j][ s[i][j] - 'A' ] = j;
			}
		}

		memset( Max, 0, sizeof(Max) );

		for (int i = len[0] - 1; i >= 0; i--)
			for (int j = len[1] - 1; j >= 0; j--)
				if (s[0][i] == s[1][j])
					Max[i][j] = Max[i + 1][j + 1] + 1;
				else
					if (Max[i + 1][j] > Max[i][j + 1])
						Max[i][j] = Max[i + 1][j];
					else
						Max[i][j] = Max[i][j + 1];

		int poz[2] = {-1, -1};
		for (; 1; )
		{
			int found = 0;
			for (int c = 'Z' - 'A'; c >= 0 && !found; c--)
			{
				int _poz[2];
				_poz[0] = first[0][ poz[0] + 1 ][c];
				_poz[1] = first[1][ poz[1] + 1 ][c];

				if (_poz[0] == -1 || _poz[1] == -1) continue;
				if (Max[ _poz[0] ][ _poz[1] ] >= K)
				{
					printf("%c", c + 'A'); K--;
					poz[0] = _poz[0];
					poz[1] = _poz[1];
					found = 1;
				}
			}
			if (!found)
				break;
		}
		printf("\n");
	}

	return 0;
}