Pagini recente » Cod sursa (job #2638980) | Cod sursa (job #2129768) | Cod sursa (job #684871) | Cod sursa (job #2662380) | Cod sursa (job #1915737)
#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!