結果
問題 | No.422 文字列変更 (Hard) |
ユーザー | anta |
提出日時 | 2016-09-09 22:44:38 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 64 ms / 3,000 ms |
コード長 | 2,145 bytes |
コンパイル時間 | 1,722 ms |
コンパイル使用メモリ | 175,816 KB |
実行使用メモリ | 71,008 KB |
最終ジャッジ日時 | 2024-04-28 14:05:14 |
合計ジャッジ時間 | 3,356 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 56 ms
49,488 KB |
testcase_02 | AC | 61 ms
54,656 KB |
testcase_03 | AC | 51 ms
45,440 KB |
testcase_04 | AC | 56 ms
49,488 KB |
testcase_05 | AC | 64 ms
57,000 KB |
testcase_06 | AC | 55 ms
71,008 KB |
testcase_07 | AC | 2 ms
5,376 KB |
testcase_08 | AC | 2 ms
5,376 KB |
testcase_09 | AC | 59 ms
65,024 KB |
testcase_10 | AC | 63 ms
68,992 KB |
testcase_11 | AC | 56 ms
50,432 KB |
testcase_12 | AC | 50 ms
44,800 KB |
testcase_13 | AC | 53 ms
46,816 KB |
testcase_14 | AC | 54 ms
48,000 KB |
testcase_15 | AC | 55 ms
48,464 KB |
testcase_16 | AC | 56 ms
50,304 KB |
ソースコード
#include "bits/stdc++.h" using namespace std; #define rep(i,n) for(int (i)=0;(i)<(int)(n);++(i)) #define rer(i,l,u) for(int (i)=(int)(l);(i)<=(int)(u);++(i)) #define reu(i,l,u) for(int (i)=(int)(l);(i)<(int)(u);++(i)) static const int INF = 0x3f3f3f3f; static const long long INFL = 0x3f3f3f3f3f3f3f3fLL; typedef vector<int> vi; typedef pair<int, int> pii; typedef vector<pair<int, int> > vpii; typedef long long ll; template<typename T, typename U> static void amin(T &x, U y) { if(y < x) x = y; } template<typename T, typename U> static void amax(T &x, U y) { if(x < y) x = y; } typedef pair<int, pii> P; struct DP { vector<P> dp; int n, m; DP(int n, int m) : n(n), m(m), dp((n + 1) * (m + 1) * 4, P{ INF,{-1,-1} }) {} P &operator()(int i, int j, int lasti, int lastj) { return dp[(i * (m + 1) + j) * 4 + lasti * 2 + lastj]; } }; int main() { int n; int m; while(~scanf("%d%d", &n, &m)) { char S[1201], T[1201]; scanf("%s", S); scanf("%s", T); DP dp(n, m); dp(0, 0, 0, 0) = { 0, {-1, -1} }; rep(i, n + 1) rep(j, m + 1) rep(lasti, 2) rep(lastj, 2) { int x = dp(i, j, lasti, lastj).first; if(x == INF) continue; pair<int, int> p(i * 2 + lasti, j * 2 + lastj); if(i < n && j < m) amin(dp(i + 1, j + 1, 0, 0), P{ x + (S[i] == T[j] ? 0 : 5), p }); if(i < n) amin(dp(i + 1, j, 1, 0), P{ x + (lasti == 0 ? 9 : 2), p }); if(j < m) amin(dp(i, j + 1, 0, 1), P{ x + (lastj == 0 ? 9 : 2), p }); } pair<int, pii> ans{ INF,{} }; rep(lasti, 2) rep(lastj, 2) amin(ans, make_pair(dp(n, m, lasti, lastj).first, make_pair(lasti, lastj))); printf("%d\n", ans.first); string alignment[2]; { int i = n, j = m, lasti = ans.second.first, lastj = ans.second.second; while(i != 0 || j != 0) { int pi, pj; tie(pi, pj) = dp(i, j, lasti, lastj).second; int ni = pi / 2, nj = pj / 2; alignment[0] += ni + 1 == i ? S[ni] : '-'; alignment[1] += nj + 1 == j ? T[nj] : '-'; i = ni, j = nj; lasti = pi % 2, lastj = pj % 2; } rep(k, 2) reverse(alignment[k].begin(), alignment[k].end()); } puts(alignment[0].c_str()); puts(alignment[1].c_str()); } return 0; }