Cod sursa(job #193234)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 3 iunie 2008 00:57:27
Problema Seif Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

#define maxn 1010
#define maxalf 26
#define max(a,b) (a > b ? a : b)

int n, m, k, l;
char a[maxn], b[maxn];
int c[maxn][maxn];
vector <int> p1[maxalf];
vector <int> p2[maxalf];
int g1[maxn], g2[maxn];
char sol[maxn];

int main()
{
	freopen("seif.in", "r", stdin);
	freopen("seif.out", "w", stdout);

	int i, j, T, found;

	for (scanf("%d ", &T) ; T; T--)
	{
		scanf("%d ", &k);

		scanf("%s ", a+1);
		scanf("%s ", b+1);

		n = strlen(a+1);
		m = strlen(b+1);

		reverse(a+1, a+n+1);
		reverse(b+1, b+m+1);

		for (i=0; i<maxalf; i++)
		{
			p1[i].clear();
			p2[i].clear();
		}

		for (i=1; i<=n; i++) p1[a[i]-'A'].push_back(i);
		for (i=1; i<=m; i++) p2[b[i]-'A'].push_back(i);

		for (i=0; i<maxalf; i++) 
		{
			g1[i] = p1[i].size() - 1;
			g2[i] = p2[i].size() - 1;
		}

		for (i=1; i<=n; i++)
			for (j=1; j<=m; j++)
				if (a[i] == b[j]) c[i][j] = c[i-1][j-1] + 1;
				else c[i][j] = max(c[i-1][j], c[i][j-1]);

		found = 1;
		l = 0;
		while (found)
		{
			found = 0;
			for (i=maxalf-1; i>=0; i--)
			{
				while (g1[i]>=0 && p1[i][g1[i]]>n) g1[i]--;
				while (g2[i]>=0 && p2[i][g2[i]]>m) g2[i]--;

				if (g1[i]>=0 && g2[i]>=0 && c[p1[i][g1[i]]][p2[i][g2[i]]]>=k)
				{
					n = p1[i][g1[i]] - 1;
					m = p2[i][g2[i]] - 1;
					sol[++l] = 'A' + i;
					found = 1;
					break;
				}
			}

			k--;
		}

		for (i=1; i<=l; i++) printf("%c", sol[i]);
		printf("\n");
	}

	return 0;
}