#include using namespace std; #define rep(i,a,b) for(int i=a;i pre[1210][1210][3]; int ord[1210][1210][3]; int main() { cin >> N >> M >> S >> T; S += "#"; T += "#"; rep(i, 0, N + 1) rep(j, 0, M + 1) rep(k, 0, 3) dp[i][j][k] = INF; rep(i, 0, N + 1) rep(j, 0, M + 1) rep(k, 0, 3) pre[i][j][k] = {-1, -1, -1}; rep(i, 0, N + 1) rep(j, 0, M + 1) rep(k, 0, 3) ord[i][j][k] = -1; dp[0][0][0] = 0; rep(i, 0, N + 1) rep(j, 0, M + 1) rep(k, 0, 3){ int d; // nothing : 3 if (S[i] == T[j]) { if (dp[i][j][k] < dp[i + 1][j + 1][0]) { dp[i + 1][j + 1][0] = dp[i][j][k]; pre[i + 1][j + 1][0] = {i, j, k}; ord[i + 1][j + 1][0] = 3; } } // change : 0 d = dp[i][j][k] + 5; if (d < dp[i + 1][j + 1][0]) { dp[i + 1][j + 1][0] = d; pre[i + 1][j + 1][0] = { i, j, k }; ord[i + 1][j + 1][0] = 0; } // erase : 1 d = dp[i][j][k] + 2; if (k != 1) d += 7; if (d < dp[i + 1][j][1]) { dp[i + 1][j][1] = d; pre[i + 1][j][1] = { i, j, k }; ord[i + 1][j][1] = 1; } // insert : 2 d = dp[i][j][k] + 2; if (k != 2) d += 7; if (d < dp[i][j + 1][2]) { dp[i][j + 1][2] = d; pre[i][j + 1][2] = { i, j, k }; ord[i][j + 1][2] = 2; } } int ans = dp[N][M][0], kk = 0; rep(k, 1, 3) if (dp[N][M][k] < ans) ans = dp[N][M][k], kk = k; printf("%d\n", ans); vector order; tuple t = {N, M, kk}; while (0 <= get<0>(t)) { int i, j, k; tie(i, j, k) = t; //printf("<%d %d %d>\n", i, j, k); order.push_back(ord[i][j][k]); t = pre[i][j][k]; } order.pop_back(); reverse(order.begin(), order.end()); //for (int o : order) printf("%d ", o); //cout << endl; //return 0; string SS = "", TT = ""; int i = 0, j = 0; for (int o : order) { if (o == 0) { assert(i <= N && j <= M); SS += S[i], i++; TT += T[j], j++; } else if(o == 1) { assert(i <= N); SS += S[i], i++; TT += "-"; } else if (o == 2) { assert(j <= M); SS += "-"; TT += T[j], j++; } else { assert(i <= N && j <= M); SS += S[i]; i++; TT += T[j]; j++; } } cout << SS << endl << TT << endl; }