http://poj.org/problem?id=2264
#include<iostream>
#include<string>
using namespace std;
#define N 1000
char s1[N],s2[N],res[2*N];
char lcs[N];
int c[N][N];
int flag[N][N];
int flag1[N];
int flag2[N];
int getLCSlength(const char *s1, const char *s2)
{
int i,j;
int len1 = strlen(s1);
int len2 = strlen(s2);
for(i=1;i<=len1;i++)
c[i][0] = 0;
for(i=0;i<=len2;i++)
c[0][i] = 0;
for(i=1;i<=len1;i++)
for(j=1;j<=len2;j++)
{
if(s1[i-1]==s2[j-1])
{
c[i][j] = c[i-1][j-1] +1;
flag[i][j] = 0;
}
else if(c[i-1][j]>=c[i][j-1])
{
c[i][j] = c[i-1][j];
flag[i][j] = 1;
}
else
{
c[i][j] = c[i][j-1];
flag[i][j] = -1;
}
}
return c[len1][len2];
}
void getLCS(const char *s1, const char *s2,int len,char *lcs)
{
int i = strlen(s1);
int j = strlen(s2);
memset(flag1,0,sizeof(flag1));
memset(flag2,0,sizeof(flag2));
memset(res,'0',sizeof(res));
while(i >0 && j >0)
{
if(flag[i][j]==0)
{
lcs[--len] = s1[i-1];
flag1[i] = 1;
flag2[j] = 1;
i--;
j--;
}
else if(flag[i][j]==1) i--;
else j--;
}
i = 1;
j = 1;
len = 1;
while(i <= strlen(s1) && j <= strlen(s2))
{
if(flag1[i] == 1 && flag2[j] ==1)
{
res[len++] = s1[i-1];
i++;
j++;
}
else if(flag1[i] == 1 && flag2[j] ==0)
{
res[len++] = s2[j-1];
j++;
}
else if(flag2[j] == 1 && flag1[i] == 0)
{
res[len++] = s1[i-1];
i++;
}
else if(flag1[i] ==0 && flag2[j] ==0)
{
res[len++] = s1[i-1];
res[len++] = s2[j-1];
i++;
j++;
}
}
if(i <= strlen(s1))
{
for(;i <= strlen(s1);i++)
res[len++] = s1[i-1];
}
if(j <= strlen(s2))
{
for(;j <= strlen(s2);j++)
res[len++] = s2[j-1];
}
for(int i = 1; i < len;i++)
cout<<res[i];
cout<<endl;
}
int main()
{
while(cin>>s1>>s2)
{
int l=getLCSlength(s1,s2);
getLCS(s1,s2,l,lcs);
}
return 0;
}