#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAXN = 105;
char A[MAXN][32];
char B[MAXN][32];
int na,nb;
int ha[MAXN];
int hb[MAXN];
int d[MAXN][MAXN];
int s[MAXN][MAXN];
int hfunct(char *s)
{
int sum=0, seed=1313;
while(*s) {
sum = sum*seed + *s;
s++;
}
return sum;
}
void dp()
{
for(int i=1; i<=na; i++) {
for(int j=1; j<=nb; j++) {
int &cur = d[i][j];
int &idx = s[i][j];
if(ha[i] == hb[j]) {
cur = d[i-1][j-1] + 1;
idx = 1;
} else {
if(d[i-1][j] > d[i][j-1]) {
cur = d[i-1][j];
idx = 2;
} else {
cur = d[i][j-1];
idx = 3;
}
}
}
}
}
void print(int i, int j)
{
if(i==0 || j==0) return;
switch(s[i][j]) {
case 1:
print(i-1, j-1);
if(d[i][j] == d[na][nb]) {
printf("%s", A[i]);
} else
printf("%s ", A[i]);
break;
case 2:
print(i-1, j);
break;
case 3:
print(i, j-1);
break;
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
while(1) {
na = nb = 0;
while(scanf("%s", A[++na]) == 1) {
if(A[na][0] == '#') break;
ha[na] = hfunct(A[na]);
}
na--;
nb = 0;
while(scanf("%s", B[++nb]) == 1) {
if(B[nb][0] == '#') break;
hb[nb] = hfunct(B[nb]);
}
nb--;
if(na>1 || nb>1) {
dp();
print(na, nb);
printf("\n");
} else break;
}
return 0;
}
UVa 531 - Compromise
最新推荐文章于 2020-02-07 11:05:28 发布
