結果
問題 | No.422 文字列変更 (Hard) |
ユーザー |
![]() |
提出日時 | 2016-09-09 23:48:22 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 279 ms / 3,000 ms |
コード長 | 2,889 bytes |
コンパイル時間 | 1,944 ms |
コンパイル使用メモリ | 176,964 KB |
実行使用メモリ | 161,152 KB |
最終ジャッジ日時 | 2024-11-17 06:39:04 |
合計ジャッジ時間 | 5,793 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 16 |
ソースコード
#include<bits/stdc++.h>using namespace std;struct cww{cww(){ios::sync_with_stdio(false);cin.tie(0);}}init;#define N 0#define D 1#define I 2typedef long long LL;typedef vector<LL> V;typedef vector<V> VV;typedef vector<VV> VVV;const LL INF=1e15;int main(){int n,m;cin>>n>>m;string S,T;cin>>S>>T;VVV dp(n+1,VV(m+1,V(3,INF)));VVV prev(n+1,VV(m+1,V(3,-1)));dp[0][0][0]=0;for(int i=0;i<=n;i++)for(int j=0;j<=m;j++){V &now=dp[i][j];if(i<n){//DeleteV &nxt=dp[i+1][j];V &p=prev[i+1][j];if(nxt[D]>now[N]+9){nxt[D]=now[N]+9;p[D]=N;}if(nxt[D]>now[I]+9){nxt[D]=now[I]+9;p[D]=I;}if(nxt[D]>now[D]+2){nxt[D]=now[D]+2;p[D]=D;}}if(j<m){//InsertV &nxt=dp[i][j+1];V &p=prev[i][j+1];if(nxt[I]>now[N]+9){nxt[I]=now[N]+9;p[I]=N;}if(nxt[I]>now[I]+2){nxt[I]=now[I]+2;p[I]=I;}if(nxt[I]>now[D]+9){nxt[I]=now[D]+9;p[I]=D;}}if(i<n&&j<m){//ChangeV &nxt=dp[i+1][j+1];V &p=prev[i+1][j+1];int cost=0;if(S[i]!=T[j])cost=5;if(nxt[N]>now[N]+cost){nxt[N]=now[N]+cost;p[N]=N;}if(nxt[N]>now[I]+cost){nxt[N]=now[I]+cost;p[N]=I;}if(nxt[N]>now[D]+cost){nxt[N]=now[D]+cost;p[N]=D;}}}LL res=INF;int pp=-1;for(int i=0;i<3;i++)if(res>dp[n][m][i]){res=dp[n][m][i];pp=i;}cout<<res<<endl;int s=n;int t=m;string cmd;while(s>0||t>0){int np=prev[s][t][pp];// cout<<s<<" "<<t<<endl;//cout<<dp[s][t][pp]<<endl;//cout<<pp<<" "<<np<<endl;if(pp==D){s--;cmd+="D";}if(pp==I){t--;cmd+="I";}if(pp==N){s--,t--;cmd+="N";}pp=np;}string SS,TT;reverse(cmd.begin(),cmd.end());s=0,t=0;for(auto &it:cmd){if(it=='I'){SS+='-';TT+=T[t++];}if(it=='D'){TT+='-';SS+=S[s++];}if(it=='N'){SS+=S[s++];TT+=T[t++];}}cout<<SS<<endl;cout<<TT<<endl;return 0;}