#include #include using namespace std; const int INF = 1<<30; const int BUF = 1205; class Next { public: int aPos, bPos; int aStart, bStart; Next(){} Next(int aPos, int bPos, int aStart, int bStart): aPos(aPos), bPos(bPos), aStart(aStart), bStart(bStart) {} }; int aLen, bLen; string a, b; void read() { cin >> aLen >> bLen; cin >> a >> b; } void rec(int aPos, int bPos, int dp[BUF][BUF], Next next[BUF][BUF]) { int &ret = dp[aPos][bPos]; Next &nex = next[aPos][bPos]; if (ret != -1) return; if (aPos == aLen && bPos == bLen) { ret = 0; return; } ret = INF; // match if (aPos < aLen && bPos < bLen) { rec(aPos + 1, bPos + 1, dp, next); if (ret > dp[aPos + 1][bPos + 1] + (a[aPos] == b[bPos] ? 0 : 5)) { ret = dp[aPos + 1][bPos + 1] + (a[aPos] == b[bPos] ? 0 : 5); nex = Next(aPos + 1, bPos + 1, -1, -1); } } // delete for (int aStart = aPos + 1; aStart <= aLen; ++aStart) { int cost = 9 + 2 * (aStart - aPos - 1); rec(aStart, bPos, dp, next); if (ret > cost + dp[aStart][bPos]) { ret = cost + dp[aStart][bPos]; nex = Next(aStart, bPos, aStart, -1); } } // insert for (int bStart = bPos + 1; bStart <= bLen; ++bStart) { int cost = 9 + 2 * (bStart - bPos - 1); rec(aPos, bStart, dp, next); if (ret > cost + dp[aPos][bStart]) { ret = cost + dp[aPos][bStart]; nex = Next(aPos, bStart, -1, bStart); } } } void work() { static int dp[BUF][BUF]; static Next next[BUF][BUF]; memset(dp, -1, sizeof(dp)); rec(0, 0, dp, next); cout << dp[0][0] << endl; int aPos = 0; int bPos = 0; string aAns; string bAns; while (!(aPos == aLen && bPos == bLen)) { Next &nex = next[aPos][bPos]; // match if (nex.aStart == -1 && nex.bStart == -1) { aAns += a[aPos]; bAns += b[bPos]; } // delete else if (nex.aStart != -1) { for (int i = aPos; i < nex.aStart; ++i) { aAns += a[i]; bAns += '-'; } } // insert else { for (int i = bPos; i < nex.bStart; ++i) { aAns += '-'; bAns += b[i]; } } aPos = nex.aPos; bPos = nex.bPos; } cout << aAns << endl; cout << bAns << endl; } int main() { read(); work(); return 0; }