UVa 531 - Compromise
来源:互联网 发布:c语言getchar如何使用 编辑:程序博客网 时间:2024/06/16 20:37
#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;}