結果

問題 No.422 文字列変更 (Hard)
ユーザー btk
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#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 2
typedef 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){//Delete
V &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){//Insert
V &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){//Change
V &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;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0