#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<stack>
using namespace std;
char x[]=" abcbdab";
char y[]=" bdcaba";
stack<char> stk;
//X={x1, x2, ..., xm}, Y={y1, y2, ..., yn}
//m代表序列的长度,n代表Y序列的长度,x,y分别代表第一个和第二个序列,二维数组c[i][j]代表x{x1...xi}和y{y1..yj}的LCS长度
void LCS_length(int m, int n, char *x, char *y, int **c) {
int i, j;
c[0][0] = 0;
for(i=1; i<=m; i++) c[i][0] = 0; //y序列长度为0,此时c[i][0]全为0
for(i=1; i<=n; i++) c[0][i] = 0; //x序列长度为0,此时c[i][0]全为0
for(i=1; i<=m; i++) {
for(j=1; j<=n; j++) {
if(x[i] == y[j]) {
c[i][j] = c[i-1][j-1] + 1;
}
else if(c[i-1][j] >= c[i][j-1]) {
c[i][j] = c[i-1][j];
}
else {
c[i][j] = c[i][j-1];
}
}
}
}
void GET_LCS(int m, int n, int **c, char *x, char *y) {
int i=m,j=n;
while(i!=0 && j!=0) {
if(x[i] == y[j]) {
stk.push(x[i]);
i--, j--;
}
else if(c[i-1][j] >= c[i][j-1]) {
i--;
}
else {
j--;
}
}
while(!stk.empty()) {
cout<<stk.top();
stk.pop();
}
cout<<endl;
}
int main()
{
int **c;
int i;
c = (int **)(new int[8]);
for(i=0; i<=7; i++) {
c[i] = (int *)(new int[7]);
}
LCS_length(7, 6, x, y, c);
GET_LCS(7, 6, c, x, y);
return 0;
}