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;}

原创粉丝点击