【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");
}
}
还是要多加油啊