#define _USE_MATH_DEFINES #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; const int INF = INT_MAX / 2; int main() { int n, m; string s, t; cin >> n >> m >> s >> t; vector > > dp(3, vector >(n+1, vector(m+1, INF))); vector > > > prev(3, vector > >(n+1, vector >(m+1, make_tuple(-1, -1, -1)))); dp[0][0][0] = 0; for(int j=0; j<=n; ++j){ for(int k=0; k<=m; ++k){ for(int i=0; i<3; ++i){ if(dp[i][j][k] == INF) continue; if(j < n && k < m){ int cost = dp[i][j][k]; if(s[j] != t[k]) cost += 5; if(cost < dp[0][j+1][k+1]){ dp[0][j+1][k+1] = cost; prev[0][j+1][k+1] = make_tuple(i, j, k); } } if(j < n){ int cost = dp[i][j][k]; if(i == 1) cost += 2; else cost += 9; if(cost < dp[1][j+1][k]){ dp[1][j+1][k] = cost; prev[1][j+1][k] = make_tuple(i, j, k); } } if(k < m){ int cost = dp[i][j][k]; if(i == 2) cost += 2; else cost += 9; if(cost < dp[2][j][k+1]){ dp[2][j][k+1] = cost; prev[2][j][k+1] = make_tuple(i, j, k); } } } } } int i = 0; int j = n; int k = m; for(int l=0; l<3; ++l){ if(dp[l][j][k] < dp[i][j][k]) i = l; } cout << dp[i][j][k] << endl; string s2; string t2; while(!(j == 0 && k == 0)){ if(i == 0){ s2 += s[j-1]; t2 += t[k-1]; } else if(i == 1){ s2 += s[j-1]; t2 += '-'; } else{ s2 += '-'; t2 += t[k-1]; } tie(i, j, k) = prev[i][j][k]; } reverse(s2.begin(), s2.end()); reverse(t2.begin(), t2.end()); cout << s2 << endl << t2 << endl; return 0; }