結果
問題 | No.422 文字列変更 (Hard) |
ユーザー |
|
提出日時 | 2016-09-10 02:04:23 |
言語 | C++11 (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 197 ms / 3,000 ms |
コード長 | 2,550 bytes |
コンパイル時間 | 682 ms |
コンパイル使用メモリ | 58,140 KB |
実行使用メモリ | 71,596 KB |
最終ジャッジ日時 | 2024-11-17 06:48:48 |
合計ジャッジ時間 | 3,755 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 16 |
ソースコード
#include<iostream>#include<cstring>using namespace std;const int INF = 1<<30;const int BUF = 1205;enum Type {MATCH = 0,DELETE = 1,INSERT = 2};class Next {public:int type, aPt, bPt;Next(){}Next(int type, int aPt, int bPt):type(type), aPt(aPt), bPt(bPt){}};int aLen, bLen;string a, b;void read() {cin >> aLen >> bLen;cin >> a >> b;}void rec(int preType, int aPos, int bPos, int dp[3][BUF][BUF], Next next[3][BUF][BUF]) {int &ret = dp[preType][aPos][bPos];Next &nex = next[preType][aPos][bPos];if (ret != -1) return;if (aPos == aLen && bPos == bLen) {ret = 0;return;}ret = INF;// matchif (aPos < aLen && bPos < bLen) {rec(MATCH, aPos + 1, bPos + 1, dp, next);if (ret > dp[MATCH][aPos + 1][bPos + 1] + (a[aPos] == b[bPos] ? 0 : 5)) {ret = dp[MATCH][aPos + 1][bPos + 1] + (a[aPos] == b[bPos] ? 0 : 5);nex = Next(MATCH, aPos + 1, bPos + 1);}}// deleteif (aPos < aLen) {rec(DELETE, aPos + 1, bPos, dp, next);if (ret > (preType == DELETE ? 2 : 9) + dp[DELETE][aPos + 1][bPos]) {ret = (preType == DELETE ? 2 : 9) + dp[DELETE][aPos + 1][bPos];nex = Next(DELETE, aPos + 1, bPos);}}// insertif (bPos < bLen) {rec(INSERT, aPos, bPos + 1, dp, next);if (ret > (preType == INSERT ? 2 : 9) + dp[INSERT][aPos][bPos + 1]) {ret = (preType == INSERT ? 2 : 9) + dp[INSERT][aPos][bPos + 1];nex = Next(INSERT, aPos, bPos + 1);}}}void work() {static int dp[3][BUF][BUF];static Next next[3][BUF][BUF];memset(dp, -1, sizeof(dp));rec(MATCH, 0, 0, dp, next);cout << dp[MATCH][0][0] << endl;int preType = MATCH;int aPos = 0;int bPos = 0;string aAns;string bAns;while (!(aPos == aLen && bPos == bLen)) {Next &nex = next[preType][aPos][bPos];switch (nex.type) {case MATCH:aAns += a[aPos];bAns += b[bPos];break;case DELETE:aAns += a[aPos];bAns += '-';break;case INSERT:aAns += '-';bAns += b[bPos];break;}preType = nex.type;aPos = nex.aPt;bPos = nex.bPt;}cout << aAns << endl;cout << bAns << endl;}int main() {read();work();return 0;}