#include <iostream>
#include <vector>
#include <string>
using namespace std;
string getLCS(string X, string Y) {
int m = X.length(), n = Y.length();
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
// Build dp table
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
if (X[i - 1] == Y[j - 1])
dp[i][j] = 1 + dp[i - 1][j - 1];
else
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
// Backtrack to find the LCS string
string lcs = "";
int i = m, j = n;
while (i > 0 && j > 0) {
if (X[i - 1] == Y[j - 1]) {
lcs = X[i - 1] + lcs;
--i; --j;
} else if (dp[i - 1][j] > dp[i][j - 1]) {
--i;
} else {
--j;
}
}
return lcs;
}
int main() {
string str1 = "ABCBDAB";
string str2 = "BDCAB";
string lcs = getLCS(str1, str2);
cout << "Length of LCS: " << lcs.length() << endl;
cout << "LCS: " << lcs << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RyaW5nPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cmluZyBnZXRMQ1Moc3RyaW5nIFgsIHN0cmluZyBZKSB7CiAgICBpbnQgbSA9IFgubGVuZ3RoKCksIG4gPSBZLmxlbmd0aCgpOwogICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBkcChtICsgMSwgdmVjdG9yPGludD4obiArIDEsIDApKTsKCiAgICAvLyBCdWlsZCBkcCB0YWJsZQogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbTsgKytpKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPD0gbjsgKytqKSB7CiAgICAgICAgICAgIGlmIChYW2kgLSAxXSA9PSBZW2ogLSAxXSkKICAgICAgICAgICAgICAgIGRwW2ldW2pdID0gMSArIGRwW2kgLSAxXVtqIC0gMV07CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGRwW2ldW2pdID0gbWF4KGRwW2kgLSAxXVtqXSwgZHBbaV1baiAtIDFdKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gQmFja3RyYWNrIHRvIGZpbmQgdGhlIExDUyBzdHJpbmcKICAgIHN0cmluZyBsY3MgPSAiIjsKICAgIGludCBpID0gbSwgaiA9IG47CiAgICB3aGlsZSAoaSA+IDAgJiYgaiA+IDApIHsKICAgICAgICBpZiAoWFtpIC0gMV0gPT0gWVtqIC0gMV0pIHsKICAgICAgICAgICAgbGNzID0gWFtpIC0gMV0gKyBsY3M7CiAgICAgICAgICAgIC0taTsgLS1qOwogICAgICAgIH0gZWxzZSBpZiAoZHBbaSAtIDFdW2pdID4gZHBbaV1baiAtIDFdKSB7CiAgICAgICAgICAgIC0taTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAtLWo7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBsY3M7Cn0KCmludCBtYWluKCkgewogICAgc3RyaW5nIHN0cjEgPSAiQUJDQkRBQiI7CiAgICBzdHJpbmcgc3RyMiA9ICJCRENBQiI7CiAgICBzdHJpbmcgbGNzID0gZ2V0TENTKHN0cjEsIHN0cjIpOwogICAgY291dCA8PCAiTGVuZ3RoIG9mIExDUzogIiA8PCBsY3MubGVuZ3RoKCkgPDwgZW5kbDsKICAgIGNvdXQgPDwgIkxDUzogIiA8PCBsY3MgPDwgZW5kbDsKICAgIHJldHVybiAwOwp9Cg==