Codeforces Round #307 (Div. 2) B. ZgukistringZ
Professor GukiZ doesn't accept string as they are. He likes to swap some letters in string to obtain a new one.
GukiZ has strings a, b,
and c. He wants to obtain string k by
swapping some letters in a, so that k should
contain as many non-overlapping substrings equal either to b or c as
possible. Substring of string x is a string formed by consecutive segment of characters from x.
Two substrings of string x overlap if there is position i in
string x occupied by both of them.
GukiZ was disappointed because none of his students managed to solve the problem. Can you help them and find one of possible strings k?
The first line contains string a, the second line contains string b,
and the third line contains string c (1 ≤ |a|, |b|, |c| ≤ 105,
where |s|denotes the length of string s).
All three strings consist only of lowercase English letters.
It is possible that b and c coincide.
Find one of possible strings k, as described in the problem statement. If there are multiple possible answers, print any of them.
aaa
a
b
aaa
pozdravstaklenidodiri
niste
dobri
nisteaadddiiklooprrvz
abbbaaccca
ab
aca
ababacabcc
In the third sample, this optimal solutions has three non-overlaping substrings equal to either b or c on
positions 1 – 2 (ab), 3 – 4 (ab),5 – 7 (aca).
In this sample, there exist many other optimal solutions, one of them would be acaababbcc.
这题因为字母可以随意调换,所以先数出a,b,c三个字符串所有字母表中的字母的个数,然后看最多能填充多少个b字符串minx,然后填充0~minx个字符串,再看在当前情况下能填充多少个c字符串,计算最大值。
#include<stdio.h>
#include<string.h>
char s1[100006],s2[100006],s3[100006];
int a[30],b[30],c[30],a1[30];
int main()
{
int n,m,i,j,len1,len2,len3,minx1,minx2,maxx,minx,t1,t2;
while(scanf("%s",s1)!=EOF)
{
scanf("%s%s",s2,s3);
len1=strlen(s1);
len2=strlen(s2);len3=strlen(s3);
memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(c,0,sizeof(c));memset(a1,0,sizeof(a1));
for(i=0;i<len1;i++){
a[s1[i]-'a']++;a1[s1[i]-'a']++;
}
for(i=0;i<len2;i++){
b[s2[i]-'a']++;
}
for(i=0;i<len3;i++){
c[s3[i]-'a']++;
}
minx1=200006;
for(i=0;i<=25;i++){
if(b[i]==0)continue;
if(minx1>(a[i]/b[i]))minx1=a[i]/b[i];
}
minx2=200006;
for(i=0;i<=25;i++){
if(c[i]==0)continue;
if(minx2>(a[i]/c[i]))minx2=a[i]/c[i];
}
maxx=minx2;t1=0;t2=minx2;
for(i=1;i<=minx1;i++){
minx=200006;
for(j=0;j<=25;j++){
a[j]-=b[j];
}
for(j=0;j<=25;j++){
if(c[j]==0)continue;
if(minx>(a[j]/c[j]))minx=a[j]/c[j];
}
if(maxx<minx+i){
maxx=minx+i;
t1=i;t2=minx;
}
}
for(i=1;i<=t1;i++)printf("%s",s2);
for(i=1;i<=t2;i++)printf("%s",s3);
for(i=0;i<=25;i++){
a1[i]=a1[i]-t1*b[i]-t2*c[i];
for(j=1;j<=a1[i];j++){
printf("%c",'a'+i);
}
}
printf("\n");
}
return 0;
}
Codeforces Round #307 (Div. 2) B. ZgukistringZ的更多相关文章
- 字符串处理/贪心 Codeforces Round #307 (Div. 2) B. ZgukistringZ
题目传送门 /* 题意:任意排列第一个字符串,使得有最多的不覆盖a/b字符串出现 字符串处理/贪心:暴力找到最大能不覆盖的a字符串,然后在b字符串中动态得出最优解 恶心死我了,我最初想输出最多的a,再 ...
- Codeforces Round #307 (Div. 2) B. ZgukistringZ 暴力
B. ZgukistringZ Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/551/probl ...
- 水题 Codeforces Round #307 (Div. 2) A. GukiZ and Contest
题目传送门 /* 水题:开个结构体,rk记录排名,相同的值有相同的排名 */ #include <cstdio> #include <cstring> #include < ...
- 「日常训练」ZgukistringZ(Codeforces Round #307 Div. 2 B)
题意与分析(CodeForces 551B) 这他妈哪里是日常训练,这是日常弟中弟. 题意是这样的,给出一个字符串A,再给出两个字符串B,C,求A中任意量字符交换后(不限制次数)能够得到的使B,C作为 ...
- Codeforces Round #307 (Div. 2) E. GukiZ and GukiZiana 分块
E. GukiZ and GukiZiana Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/55 ...
- Codeforces Round #307 (Div. 2) C. GukiZ hates Boxes 贪心/二分
C. GukiZ hates Boxes Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/551/ ...
- Codeforces Round #307 (Div. 2) A. GukiZ and Contest 水题
A. GukiZ and Contest Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/551/ ...
- Codeforces Round #307 (Div. 2) D. GukiZ and Binary Operations (矩阵高速幂)
题目地址:http://codeforces.com/contest/551/problem/D 分析下公式能够知道,相当于每一位上放0或者1使得最后成为0或者1.假设最后是0的话,那么全部相邻位一定 ...
- Codeforces Round #307 (Div. 2) E. GukiZ and GukiZiana (分块)
题目地址:http://codeforces.com/contest/551/problem/E 将n平均分成sqrt(n)块,对每一块从小到大排序,并设置一个总体偏移量. 改动操作:l~r区间内,对 ...
随机推荐
- LeetCode 二分查找模板 II
模板 #2: int binarySearch(vector<int>& nums, int target){ if(nums.size() == 0) return -1; in ...
- Hbase 手动执行MajorCompation
说明: Major Compaction 的作用: 1.将一个Region下的所有StoreFile合并成一个StoreFile文件 2.对于删除.过期.多余版本的数据进行清除 由于MajorComp ...
- 类转json的基类实现
类转json的基类实现 项目地址 github地址 实现原理 使用反射获取类的属性名和属性内容.具体原理可以自己查一下资料 对一个类调用getClass().getDeclaredFields()可以 ...
- +load和+initialize方法调用时机
一.+load方法什么时候调用 +load方法会在runtime加载类.分类时调用(程序运行起来会先去加载调用+load 跟你引用没有引用其头文件没有关系).每个类.分类的+load,在程序运行过程中 ...
- 如何安装快速 Docker 和 Docker-Compose 服务
最近由于个人在大家基于 Docker 的.企业级的CI/CD 环境,所以要安装 Docker 和 Docker-Compose ,这也算是一个学习过程,就把整个过程记录下来,便于以后查询. 测试环境 ...
- Py基础—变量名,条件循环,空执行,编码,运算符,字符比较,简化写法
变量名 只能是字母,数字,下划线.数字不能开头,不要和python内置的东西重复.赋予变量名内容:name1 = "shit" 输出变量名内容 print(name1) 条件语句 ...
- 计算机网络安全 —— 报文摘要算法 ME5 (三)
一.报文摘要算法基本概念 使用加密通常可达到报文鉴别的目的,因为伪造的报文解密后一般不能得到可理解的内容.但简单采用这种方法,计算机很难自动识别报文是否被篡改.另外,对于不需要保密而只需要报文鉴别的网 ...
- 华为交换机telnet登录时老是提醒是否更改初始密码- Warning: The initial password poses security risks
问题:华为交换机在Telnet登录的时候总是提示初始密码不安全需要修改密码的处理方法 Warning: The initial password poses security risks 如果你输 ...
- 【python刷题】LRU
什么是LRU? LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰.该算法赋予每个页面一个访问字段,用来记录一个页面自上次 ...
- 给定HDFS中某一个目录,输出该目录下的所有文件的读写权限、大小、创建时间、路径等信息,如果该文件是目录,则递归输出该目录下所有文件相关信息。
1 import java.text.SimpleDateFormat; 2 import org.apache.hadoop.fs.*; 3 4 public class E_RecursiveRe ...