Cod sursa(job #134652)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 12 februarie 2008 00:06:17
Problema Seif Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <stdio.h>
#include <string.h>

int n, m, c[1002][1002], t, k;
char a[1001], b[1001];
typedef struct nod
{
	int i, j;
	nod *a;
} *lista;
lista v[30];

void init()
{
	int i, j;
	for (i = 1; i <= 30; i++) v[i] = NULL;
	for (i = 1; i <= n + 1; i++)
		for (j = 1; j <= m + 1; j++) c[i][j] = 0;
}

int max(int x, int y) {return x > y ? x : y;}

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

	int i, j, ii, jj, ok, nr, l;
	lista p;

	scanf("%d",&t);
	while (t--)
	{
		scanf("%d",&k);
		scanf("%s",&a);		scanf("%s",&b);
		n = strlen(a);		m = strlen(b);
		init();

		for(i = n; i >= 1; i--)
			for (j = m; j >= 1; j--)
				if (a[i-1] == b[j-1])
				{
					c[i][j] = c[i+1][j+1] + 1;
					p = new nod;
					p -> i = i;
					p -> j = j;
					p -> a = v[a[i-1] - 'A' + 1];
					v[a[i-1] - 'A' + 1] = p;
				}
				else c[i][j] = max (c[i+1][j],c[i][j+1]);
		nr = 0; ok = 1;
		ii = 0; jj = 0;
		while (ok)
		{
			ok = 0;
			for (l = 28; l >= 1; l--)
			{
				if (v[l])
				{
					i = v[l] -> i;
					j = v[l] -> j;
					while (1)
						if (c[i][j] >= k - nr)
						{
							if (i > ii && j > jj)
							{
								printf("%c",a[i-1]);
								ii = i;
								jj = j;
								v[l] = v[l] -> a;
								nr++;
								ok = 1;
								break;
							}
							v[l] = v[l] -> a;
							i = v[l] -> i;
							j = v[l] -> j;
							if (v[l] == NULL) break;
						}
						else break;					
				}
			}
		}
		printf("\n");
	}
	return 0;
}