【AGC052A】

题目

\(有T组询问\) \(每次给一个n\) \(3个01串\)\(这三个串每个都有n个0\)\(n个1\),\(求一个2*n + 1的字符串\)\(使他成为S1+S1,S2+S2,S3+S3的共同子序列\)

思路

昨晚去打了下\(AGC\),发现卡在\(A\)了,说明自己还没有到那个水准就是了
构造题啊,我是不会做的。
大概讲下证明过程,考虑这样的答案\(n*0 + n * 1 + 0\)
下面证明充分性
对于这样一个串\(S\),设\(k\)为该串末尾的\(1\)的数量
那么我们在\(2 * S\)这个长度为\(4 * n\)的串中的前\(2 * n\)个字符里选择\(n 个 0\),再选上\(2 * n - k + 1 到 2 * n\)\(k\)\(1\),再在后面的串里选择\(n - k\)\(1\)
此时我们知道我们必定还能再选上一个\(0\),否则同\(k\)的定义相悖。

代码

#include<bits/stdc++.h>
#define ll long long

ll t,n;

char s[200005];

int main(){
	scanf("%d",&t);
	while(t -- ){
		scanf("%d",&n);
		for(int i = 1;i <= 3;++i)
		scanf("%s",s + 1);
		for(int i = 1;i <= n;++i)
		std::cout<<0;
		for(int i = 1;i <= n;++i)
		std::cout<<1;
		puts("0");
	}
}

还是要多加油啊

posted @ 2021-03-08 20:23  fhq_treap  阅读(70)  评论(0编辑  收藏  举报