#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
struct point
{
int len;
int pi,pj;
//char str[31];
string str;
};
point p[101][101];
int max(int x,int y)
{
return (x>y?x:y);
}
int main(int args,char** argv)
{
vector<string> vs1;
vector<string> vs2;
char tch[31];
while(cin>>tch)
{
vs1.clear();
vs2.clear();
while(tch[0]!='#')
{
vs1.push_back(tch);
cin>>tch;
}//while
cin>>tch;
while(tch[0]!='#')
{
vs2.push_back(tch);
cin>>tch;
}//while
for(int i=0;i<vs1.size();i++)
{
for(int j=0;j<vs2.size();j++)
{
p[i][j].len=0;
p[i][j].pi=-1;
p[i][j].pj=-1;
p[i][j].str="";
}//for
}//for
for(int i=0;i<vs1.size();i++)
{
for(int j=0;j<vs2.size();j++)
{
//int
if(vs1[i]==vs2[j])
{
if(i>0&&j>0)
{
//string s=vs1[i];
p[i][j].len=p[i-1][j-1].len+1;
p[i][j].pi=i;
p[i][j].pj=j;
p[i][j].str=vs1[i];
}
else
{
p[i][j].len=1;
//strcpy(p[i][j].str,vs1[i]);
p[i][j].str=vs1[i];
p[i][j].pi=i;
p[i][j].pj=j;
}
}//if
else
{
int tmp1=0,tmp2=0;
if(i>0) tmp1=p[i-1][j].len;
if(j>0) tmp2=p[i][j-1].len;
p[i][j].len=max(tmp1,tmp2);
if(tmp1>tmp2)
{
p[i][j].pi=p[i-1][j].pi;
p[i][j].pj=p[i-1][j].pj;
//strcpy(p[i][j].str,p[i-1][j].str);
//p[i][j].str=p[i-1][j].str;
}
else if(tmp1<tmp2)
{
p[i][j].pi=p[i][j-1].pi;
p[i][j].pj=p[i][j-1].pj;
//strcpy(p[i][j].str,p[i][j-1].str);
//p[i][j].str=p[i][j-1].str;
}
else
{
if(j>0)
{
p[i][j].pi=p[i][j-1].pi;
p[i][j].pj=p[i][j-1].pj;
//strcpy(p[i][j].str,p[i][j-1].str);
//p[i][j].str=p[i][j-1].str;
}
else if(i>0)
{
p[i][j].pi=p[i-1][j].pi;
p[i][j].pj=p[i-1][j].pj;
//strcpy(p[i][j].str,p[i-1][j].str);
//p[i][j].str=p[i-1][j].str;
}
}//else
}//else
}//for
}//for
int i=vs1.size();
int j=vs2.size();
//cout<<p[i-1][j-1].len<<endl;
int k=p[i-1][j-1].len,itmp,jtmp,ii,jj;
vs1.clear();
itmp=i-1;
jtmp=j-1;
while(k--)
{
if(p[itmp][jtmp].str=="")
{
ii=p[itmp][jtmp].pi;
jj=p[itmp][jtmp].pj;
vs1.push_back(p[ii][jj].str);
//cout<<p[ii][jj].str<<" ";
itmp=ii-1;
jtmp=jj-1;
}
else
{
vs1.push_back(p[itmp][jtmp].str);
//cout<<p[itmp][jtmp].str<<" ";
itmp=itmp-1;
jtmp=jtmp-1;
}
}
//cout<<vs1.size();
for(int i=vs1.size()-1;i>0;i--)
cout<<vs1[i]<<" ";
cout<<vs1[0]<<endl;
}//while
return 0;
}
http://acm.hit.edu.cn/hoj/problem/view?id=1447
dp,最长公共子序列问题,不过需要存储公共的字符串。