Cod sursa(job #134717)

Utilizator damaDamaschin Mihai dama Data 12 februarie 2008 09:44:56
Problema Seif Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <stdio.h>
#include <string.h>

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


	scanf("%d ", &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(" %d ", &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)
		{
			pos[i] = 1;
		}
		while(ok)
		{
			ok = 0;
			for(i = 25; i >= 0; --i)
			{
				//printf("i:%hd pos[i]:%hd first[i][0]:%hd second[i][0]:%hd c:%hd k:%hd cnt:%hd\n", i, pos[i], first[i][0], second[i][0], c[first[i][pos[i]] + 1][second[i][pos[i]] + 1], k, cnt);
				if(pos[i] <= first[i][0] && pos[i] <= second[i][0] && (c[first[i][pos[i]] + 1][second[i][pos[i]] + 1] + cnt + 1 >= k))
				{
					sol[++cnt] = 'A' + i;
					last1 = first[i][pos[i]];
					last2 = second[i][pos[i]];
					++pos[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][pos[i]] <= last1 && pos[i] <= first[i][0])
					++pos[i];
				while(second[i][pos[i]] <= last2 && pos[i] <= second[i][0])
					++pos[i];
			}
		}
		printf("\n");
	}

	return 0;
}