/*
最长公共子序列: 输出s1 和s2 的最长公共子序列 不一定连续 如 abcde aafe 则结果为ae
*/
#include <stdio.h>
#include <string.h>
#define MAXLEN 3000//输入的字符串的最大长度
char x[MAXLEN];
char y[MAXLEN];
int b[MAXLEN][MAXLEN];//b存的是方向 用来辅助输出最后的公共字串
int c[MAXLEN][MAXLEN];//c[i][j] 表示s1 前i个字符和s2 前j个字符的最长公共子序列
void LCSLength(int n, int m)
{
int i, j;
for(i = 0; i <= n; i++)
c[i][0] = 0;
for(j = 1; j <= m; j++)
c[0][j] = 0;
for(i = 1; i<= n; i++)
{
for(j = 1; j <= m; j++)
{
if(x[i-1] == y[j-1])//2者相等的时候 则此时 c[i][j] = c[i-1][j-1] + 1;
{
c[i][j] = c[i-1][j-1] + 1;
b[i][j] = 0;
}
else if(c[i-1][j] >= c[i][j-1])//如果不相等 则c[i][j]的值取c[i][j-1],c[i-1][j]中最大的
{
c[i][j] = c[i-1][j];
b[i][j] = 1;
}
else
{
c[i][j] = c[i][j-1];
b[i][j] = -1;
}
}
}
}
void FindLCS(int i, int j)//递归输出最长公共子序列
{
if(i == 0 || j == 0)
return;
if(b[i][j] == 0)
{
FindLCS(i-1,j-1);
printf("%c",x[i-1]);
}
else if(b[i][j] == 1)
FindLCS(i-1,j);//如果是标记为1 则剩余的未输出字符 从s1的前i-1个 s2的前j个中找出来 当递归到标记为0的时候就可以输出了
else
FindLCS(i,j-1);
}
int main(int argc, char **argv)
{
while(scanf("%s %s",x,y)!=EOF)
{
int m,n;
n = strlen(x);
m = strlen(y);
LCSLength(n,m);
FindLCS(n,m);
//printf("%d",c[n][m]);//输出公共串的最长的长度
printf("\n");
}
return 0;
}