Cod sursa(job #1915737)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 8 martie 2017 22:19:42
Problema Seif Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <algorithm>

const int kMaxDim = 1005;
const int kSigma = 26;

char text1[kMaxDim], text2[kMaxDim];
int next1[kMaxDim][kSigma], next2[kMaxDim][kSigma];
int dp[kMaxDim][kMaxDim];

int main() {
	std::ifstream inputFile("seif.in");
	std::ofstream outputFile("seif.out");

	int testCount;
	inputFile >> testCount;

	while (testCount--) {
		int minLen;
		inputFile >> minLen;

		inputFile >> (text1 + 1);
		inputFile >> (text2 + 1);

		int len1 = std::strlen(text1 + 1);
		int len2 = std::strlen(text2 + 1);

		memset(next1, 0, sizeof next1);
		for (int i = len1; i; --i) {
			for (int j = 0; j < kSigma; ++j)
				next1[i][j] = next1[i + 1][j];

			next1[i][text1[i] - 'A'] = i;
		}

		memset(next2, 0, sizeof next2);
		for (int i = len2; i; --i) {
			for (int j = 0; j < kSigma; ++j)
				next2[i][j] = next2[i + 1][j];

			next2[i][text2[i] - 'A'] = i;
		}

		memset(dp, 0, sizeof dp);
		for (int i = len1; i; --i)
			for (int j = len2; j; --j)
				if (text1[i] == text2[j])
					dp[i][j] = 1 + dp[i + 1][j + 1];
				else
					dp[i][j] = std::max(dp[i + 1][j], dp[i][j + 1]);

		for (int i = 1, j = 1; i <= len1 && j <= len2;) {
			for (char letter = 'Z'; letter >= 'A'; --letter) {
				if (next1[i][letter - 'A'] == 0 || next2[j][letter - 'A'] == 0)
					continue;

				if (dp[next1[i][letter - 'A']][next2[j][letter - 'A']] < minLen)
					continue;

				outputFile << letter;
				i = next1[i][letter - 'A'] + 1;
				j = next2[j][letter - 'A'] + 1;
				minLen--;

				break;
			}
		}

		outputFile << '\n';
	}

	inputFile.close();
	outputFile.close();

	return 0;
}

//Trust me, I'm the Doctor!