最初方針を間違えてしまった…。
https://atcoder.jp/contests/arc211/tasks/arc211_b
問題
正整数X,Y,Zが与えられる。なお、X≦Y≦Zとする。
3つの整数列S1,S2,S3が以下を満たすようにしたい。
- S1とS2で共通する連続部分列の長さは最長でX
- S1とS3で共通する連続部分列の長さは最長でY
- S2とS3で共通する連続部分列の長さは最長でZ
S中に現れる整数の種類を最小化し、一例を示せ。
解法
- X=Yの場合、S1を'0'*X、S2,S3を'0'*Zとすればよい。
- X<Yの場合、以下のようにした。
- S1は、'1'*Y
- S2は、'0'*(Z-X)+'1'*X
- S3は、'0'*(Z-X)+'1'*Y
S1とS2,S3は'1'の部分が一致するのでそれぞれ共通する連続部分列の長さはX,Y。
S2はS3の部分文字列なので、当然S2とS3で共通する連続部分列の長さは最長でZとなり、条件を満たす。
int X,Y,Z; void solve() { int i,j,k,l,r,x,y; string s; cin>>X>>Y>>Z; if(X==Y) { cout<<X; FOR(i,X) cout<<" 0"; cout<<endl; cout<<Z; FOR(i,Z) cout<<" 0"; cout<<endl; cout<<Z; FOR(i,Z) cout<<" 0"; cout<<endl; return; } cout<<Y; FOR(i,Y) cout<<" 1"; cout<<endl; cout<<Z; FOR(i,Z-X) cout<<" 0"; FOR(i,X) cout<<" 1"; cout<<endl; cout<<Z-X+Y; FOR(i,Z-X) cout<<" 0"; FOR(i,Y) cout<<" 1"; cout<<endl; }
まとめ
ここまでは良かったのにね。