Cod sursa(job #2007334)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 2 august 2017 15:36:05
Problema Seif Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;

ifstream fi("seif.in");
ofstream fo("seif.out");

using pii = pair<int, int>;

const int N = 1024;

int la[N][N], lb[N][N];
char a[N], b[N];

int n, m, k;

bool sm(pii u, pii v) {
	if (a[u.x] != b[u.y])
		tie(u.x, u.y) = tie(la[u.x][u.y], lb[u.x][u.y]);
	if (a[v.x] != b[v.y])
		tie(v.x, v.y) = tie(la[v.x][v.y], lb[v.x][v.y]);

	while ((u.x > 0 && u.y > 0) && (v.x > 0 && v.y > 0) && u != v) {
		if (a[u.x] > a[v.x])
			return false;
		if (a[u.x] < a[v.x])
			return true;

		tie(v.x, v.y) = tie(la[v.x][v.y], lb[v.x][v.y]);
		tie(u.x, u.y) = tie(la[u.x][u.y], lb[u.x][u.y]); } 

	if (v.x > 0 || v.y > 0)
		return true;

	return false; }

void greedy() {
	string str;
	int len, x, y;

	if (a[n] != b[m])
		tie(n, m) = tie(la[n][m], lb[n][m]);

	len = 0;
	tie(x, y) = tie(n, m);
	while (x > 0 && y > 0) {
		tie(x, y) = tie(la[x][y], lb[x][y]);
		++len; }
	
	tie(x, y) = tie(n, m);
	while (x > 0 && y > 0) {
		while (!str.empty() && len > k && str.back() < a[x])
			str.pop_back(), --len;
		str.push_back(a[x]); 
		tie(x, y) = tie(la[x][y], lb[x][y]); }
			
	fo << str << '\n'; }

void solve() {
	fi >> k;
	fi >> (a + 1) >> (b + 1);

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

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

	memset(la, 0x00, sizeof la);
	memset(lb, 0x00, sizeof lb);
	
	for (int i = 1; i <= n; ++i)
	for (int j = 1; j <= m; ++j)
		if (a[i] == b[j]) {
			if (a[i - 1] == b[j - 1]) {
				la[i][j] = i - 1;
				lb[i][j] = j - 1; }
			else {
				la[i][j] = la[i - 1][j - 1];
				lb[i][j] = lb[i - 1][j - 1]; } }
		else {
			if (!sm({i - 1, j}, {i, j - 1})) {
				if (a[i - 1] == b[j]) {
					la[i][j] = i - 1;
					lb[i][j] = j; }
				else {
					la[i][j] = la[i - 1][j];
					lb[i][j] = lb[i - 1][j]; } }
			else {
				if (a[i] == b[j - 1]) {
					la[i][j] = i;
					lb[i][j] = j - 1; }
				else {
					la[i][j] = la[i][j - 1];
					lb[i][j] = lb[i][j - 1]; } } } 
	greedy(); }

int main() {
	int tsk;

	fi >> tsk;
	while (tsk--)
		solve();

	return 0; }