Cod sursa(job #134723)

Utilizator damaDamaschin Mihai dama Data 12 februarie 2008 09:58:41
Problema Seif Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <stdio.h>
#include <string.h>

int main()
{
	freopen("seif.in", "r", stdin);
	freopen("seif.out", "w", stdout);
	
	short int c[1024][1024], n, m, test, k, first[26][1000], second[26][1000], cnt, p1[26], p2[26], t, i, j, ok, last1, last2;
	char a[1024], b[1024], sol[1024];


	scanf("%hd ", &t);

	for(test = 0; test < t; ++test)
	{
		memset(c, 0, sizeof(c));
		memset(first, 0, sizeof(first));
		memset(second, 0, sizeof(second));
		cnt = 0;
		last1 = last2 = 0;

		scanf(" %hd ", &k);
		fgets(a, 1024, stdin);
		scanf(" ");
		n = strlen(a) - 1;
		for(i = 0; i < n; ++i)
		{
			first[a[i] - 'A'][++first[a[i] - 'A'][0]] = i;
		}

		fgets(b, 1024, stdin);
		scanf(" ");
		m = strlen(b) - 1;
		for(i = 0; i < m; ++i)
		{
			second[b[i] - 'A'][++second[b[i] - 'A'][0]] = i;
		}

		for(i = n - 1; i >= 0; --i)
		{
			for(j = m - 1; j >= 0; --j)
			{
				c[i][j] = c[i][j + 1];
				if(c[i][j] < c[i + 1][j])
				{
					c[i][j] = c[i + 1][j];
				}
				if(a[i] == b[j] && c[i][j] < c[i + 1][j + 1] + 1)
				{
					c[i][j] = c[i + 1][j + 1] + 1;
				}
			}
		}
		ok = 1;
		for(i = 0; i <= 25; ++i)
		{
			p1[i] = 1;
			p2[i] = 1;
		}
		while(ok)
		{
			ok = 0;
			for(i = 25; i >= 0; --i)
			{
				if(p1[i] <= first[i][0] && p2[i] <= second[i][0] && (c[first[i][p1[i]] + 1][second[i][p2[i]] + 1] + cnt + 1 >= k))
				{
					sol[++cnt] = 'A' + i;
					last1 = first[i][p1[i]];
					last2 = second[i][p2[i]];
					++p1[i];
					++p2[i];
					ok = 1;
					break;
				}
			}
			//printf("last: %hd %hd\n", last1, last2);
			if(ok)
				printf("%c", sol[cnt]);
			for(i = 0; i <= 25; ++i)
			{
				while(first[i][p1[i]] <= last1 && p1[i] <= first[i][0])
					++p1[i];
				while(second[i][p2[i]] <= last2 && p2[i] <= second[i][0])
					++p2[i];
			}
		}
		printf("\n");
	}

	return 0;
}