ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[CF1508A] Binary Literature

2021-04-18 12:34:45  阅读:212  来源: 互联网

标签:Binary Literature 题目 CF1508A Min int cnt2 cnt1 字符串


前言

练习赛的时候降智写了一车面包锅,赛后一写就过。

题目

洛谷

CF

题目大意:

给定一个正整数 \(n\),接着输入三个长度为 \(2n\) 的01字符串,要求构造一个长度不超过 \(3n\) 的字符串使得至少给定的两个串为你构造的串的子序列

多组数据,\(\sum n\le 10^5\)。

讲解

其实这道题还是比较好想的。

我们发现如果其中两个串的最长公共子序列能够达到 \(n\),那么我们将剩下的都按对应的位置插入进去,就可以构造出合法解。

根据鸽巢原理可知一个长度为 \(2n\) 的01字符串,一定会使得0或1达到半数。

而题目给了三个串,那么一定会有两个串使得0或1都达到半数,随便写写就好。

注意数组不要开小了。

代码

又丑又长。

bool check(int x,int y)
{
	int cnt1 = 0,cnt2 = 0;
	for(int i = 1;i <= 2*n;++ i) 
	{
		if(a[x][i] == '0') cnt1++;
		if(a[y][i] == '0') cnt2++;
	}
	if(cnt1 >= n && cnt2 >= n)
	{
		int MIN = Min(cnt1,cnt2),now1 = 1,now2 = 1;
		for(int i = 1;i <= MIN;++ i)
		{
			while(a[x][now1] != '0') putchar(a[x][now1]),now1++;
			while(a[y][now2] != '0') putchar(a[y][now2]),now2++;
			putchar('0');
			now1++;
			now2++;
		}
		for(int i = now1;i <= 2*n;++ i) putchar(a[x][i]);
		for(int i = now2;i <= 2*n;++ i) putchar(a[y][i]);
		putchar('\n');
		return 1;
	}
	cnt1 = 2*n - cnt1; cnt2 = 2*n - cnt2;//1的个数
	if(cnt1 >= n && cnt2 >= n) 
	{
		int MIN = Min(cnt1,cnt2),now1 = 1,now2 = 1;;
		for(int i = 1;i <= MIN;++ i)
		{
			while(a[x][now1] != '1') putchar(a[x][now1]),now1++;
			while(a[y][now2] != '1') putchar(a[y][now2]),now2++;
			putchar('1');
			now1++;
			now2++;
		}
		for(int i = now1;i <= 2*n;++ i) putchar(a[x][i]);
		for(int i = now2;i <= 2*n;++ i) putchar(a[y][i]);
		putchar('\n');
		return 1;
	}
	return 0;
}

int main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	for(int T = Read(); T ;-- T)
	{
		n = Read();
		for(int i = 0;i < 3;++ i) scanf("%s",a[i]+1);
		bool f = 1;
		for(int i = 0;i < 3 && f;++ i)//其实不需要这么多次
			for(int j = 0;j < 3 && f;++ j)
				if(i != j && check(i,j))
					f = 0;
	}
	return 0;
}

标签:Binary,Literature,题目,CF1508A,Min,int,cnt2,cnt1,字符串
来源: https://www.cnblogs.com/PPLPPL/p/14673168.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有