题意:最长公共子序列,按字典序输出。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 155
char s[N][N][N];
char s1[N],s2[N];
int dp[N][N];
int main()
{
int i,j,k,t,cases;
while(scanf("%d",&t)!=EOF)
{
cases=0;
while(t--)
{
cases++;
scanf("%s",s1+1);scanf("%s",s2+1);
memset(dp,0,sizeof(dp));
memset(s,0,sizeof(s));
for(i=1;s1[i];i++)
{
for(j=1;s2[j];j++)
{
if(s1[i]==s2[j])
{
dp[i][j]=dp[i-1][j-1]+1;
for(k=0;k<dp[i-1][j-1];k++)
{
s[i][j][k]=s[i-1][j-1][k];
}
s[i][j][k]=s1[i];
}
else
{
if(dp[i-1][j]>dp[i][j-1])
{
dp[i][j]=dp[i-1][j];
strcpy(s[i][j],s[i-1][j]);
}
else if(dp[i][j-1]>dp[i-1][j])
{
dp[i][j]=dp[i][j-1];
strcpy(s[i][j],s[i][j-1]);
}
else
{
dp[i][j]=dp[i-1][j];
if(strcmp(s[i-1][j],s[i][j-1])>0)
strcpy(s[i][j],s[i][j-1]);
else
strcpy(s[i][j],s[i-1][j]);
}
}
}
}
i--,j--;
printf("Case %d: ",cases);
if(dp[i][j]==0) printf(":(\n");
else printf("%s\n",s[i][j]);
}
}
return 0;
}