kmjp's blog

競技プログラミング参加記です

AtCoder ARC #211 : B - Three Sequences

最初方針を間違えてしまった…。
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;
	
}

まとめ

ここまでは良かったのにね。