CF 1138D Camp Schedule

https://codeforces.com/contest/1138/problem/D

题意:

有一种集训最佳安排,按照这个安排日程效果最佳。

现有一次集训,已经有了训练的日程。在只能调整顺序,不能修改总训练天数的情况下,尽量按照最佳训练日程进行。调整后后输出新的日程表。

实际就是给两个01串A和B,调整A的01顺序,让B尽可能多的作为字串在A中出现;解不唯一,输出一个符合要求的就可以。

思路:

让B尽量多出现A中,那么找到B的最大匹配前后缀p,将B分成p+q;

比如 101110101, p就是101,q就是110101

然后根据A中01的数量尽量去多的输出pqqqq... ,直到不够输出q后,把剩余的01输出完。

注意在找p的时候,暴力会T,可以用kmp算法中计算next数组的方法去算。

kmp算法:

http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html

// codeforce 1139-d
// KMP 

#include <iostream>
#include <stdio.h>
#include <string>
#include <algorithm>

using namespace std;

int nex[500010];
int get_next(string q)
{
	string p = q+'3';
	int len = p.size();
	nex[0] = -1;
	int k = -1;
	int j = 0;
	while(j < len - 1)
	{
		if(k == -1 || p[j] == p[k])
			nex[++j] = ++k;
		else
			k = nex[k];
	}
/*
	cout<<"-------------------------------------"<<endl;
	cout<<p<<endl;
	for(int i=0; i<=len; i++)
		cout<<nex[i];
	cout<<endl<<"-------------------------------------"<<endl;
*/
	return nex[len-1];
}


int main()
{
	string t;
	string s;
	cin>>s;
	cin>>t;
	int t_cnt = t.size();	
	string p;
	int max_all = 0;
	// 暴力求最大匹配前后缀
	/*
	for(int i=t_cnt-1; i>0; i--)
	{
		string a = t.substr(0,i);
		string b = t.substr(t_cnt-i,i);
		if(a==b)
		{
			max_all = i;
			p = a;
			break;	
		}
	}
	*/

	// KMP找最大前后缀
	max_all = get_next(t);
	p = t.substr(0, max_all); 
	// printf("max_all = %d\n", max_all);
	// cout<<"p = "<<p<<endl;

	t = t.substr(max_all,t_cnt-max_all);
	int s_cnt = s.size();	
	int p_cnt = p.size();	
	t_cnt = t.size();	

	int t_0 = 0;
	int t_1 = 0;
	for(int i=0; i<t_cnt; i++)
		if (t[i] == '0')
			t_0 ++;
	t_1 = t_cnt-t_0;
	
	int s_0 = 0;
	int s_1 = 0;
	for(int i=0; i<s_cnt; i++)
		if (s[i] == '0')
			s_0 ++;
	s_1 = s_cnt-s_0;


	int p_0 = 0;
	int p_1 = 0;
	for(int i=0; i<p_cnt; i++)
		if (p[i] == '0')
			p_0 ++;
	p_1 = p_cnt-p_0;
/*
  	cout<<"begin to printf new char!\n";
	cout<<"s_0 = "<<s_0<<"\ns_1 = "<<s_1<<endl;
	cout<<"t_0 = "<<s_0<<"\nt_1 = "<<s_1<<endl;
	cout<<"p_0 = "<<s_0<<"\np_1 = "<<s_1<<endl;
	cout<<"s :"<<s<<endl;
	cout<<"t :"<<t<<endl;
	cout<<"p :"<<p<<endl;
*/
	
	if(s_1 >= p_1 && s_0 >= p_0)	
	{
		s_1 -= p_1;
		s_0 -= p_0;
		cout<<p;
	}

	while(s_1 >= t_1 && s_0 >= t_0)
	{
		s_1 -= t_1;
		s_0 -= t_0;
		cout<<t;
	}
	for(int i = 0; i<s_1; i++)
		printf("1");

	for(int i = 0; i<s_0; i++)
		printf("0");


	cout<<endl;
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值