分享

【AGC052A】

 小样样样样样样 2022-11-30 发布于北京

题目

\(有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");
	}
}

还是要多加油啊

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约