atcoder之A Great Alchemist
C - A Great Alchemist
Time limit : 2sec / Stack limit : 256MB / Memory limit : 256MB
Problem
Carol is a great alchemist.
In her world, each metal has a name of 2N (N
is an integer) letters long, which consists of uppercase alphabets.
Carol can create metal S3 from S1 and S2 alchemical
when she can make the name of S3 by taking N letters
each from S1 and S2then
rearranging them properly.
You are given 3 names
of the metal S1, S2, S3.
Determine wether Carol can create S3 from S1 and S2 or
not.
Input
The input will be given in the following format from the Standard Input.
S1
S2
S3
- On the first line, you will be given the name of the first metal material S1.
- On the second line, you will be given the name of the second metal material S2.
- On the third line, you will be given the name of the metal S3, which Carol wants to create.
- Each character in the S1, S2,
and S3 will be an uppercase English alphabet letter. - Each string S1, S2 and S3 has
same number of letters and the number is always even. - It is guaranteed that 2≦|S1|≦105
Output
If Carol can create S3 from S1 and S2,
output YES, if not, output NO in
one line. Make sure to insert a line break at the end of the output.
Input Example 1
- AABCCD
- ABEDDA
- EDDAAA
Output Example 1
- YES
You can make EDDAAA by
picking AAD from the first metal, and AED from
the second metal.
Input Example 2
- AAAAAB
- CCCCCB
- AAABCB
Output Example 2
- NO
To make AAABCB,
you have to take at least four letters from the first material. So this can't be created alchemical.
思路:採用回溯法,在回溯法之前能够剪枝的。
剪枝:1假设array1[i]+array2[i]<array3[i],直接输出NO;
2commonS1S3为Math.min(array1[i],array3[i]) (i=0,1,...,n-1) 求和,
commonS2S3为Math.min(array2[i],array3[i]) (i=0,1,...,n-1) 求和。
假设commonS1S3和commonS2S3分别小于n/2。直接输出NO。
import java.util.*;
public class Main {
private static final int letter_count = 26;
public static boolean backTracking(String s3, int[] array1, int[] array2,
int count1, int count2, int curIndex) {
if (curIndex >= s3.length()) // 所有试探结束
return true;
int index = s3.charAt(curIndex) - 'A'; // curIndex所相应的下标
// 假设array1[index]中没有须要的元素,同一时候count1(在s1中已经用掉的字符个数)小于n/2
if (array1[index] > 0 && count1 <= s3.length() / 2) {
array1[index]--; // 用掉s1中一个字符
if (backTracking(s3, array1, array2, count1 + 1, count2,
curIndex + 1))
return true;
array1[index]++; // 回溯
}
if (array2[index] > 0 && count2 <= s3.length() / 2) {
array2[index]--;
if (backTracking(s3, array1, array2, count1, count2 + 1,
curIndex + 1))
return true;
array2[index]++;
}
return false;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str1 = sc.next();
String str2 = sc.next();
String str3 = sc.next();
int[] num1 = new int[letter_count];
int[] num2 = new int[letter_count];
int[] num3 = new int[letter_count];
boolean flag = true;
int commonS1S3 = 0;
int commonS2S3 = 0;
for (int i = 0; i < str1.length(); i++) {
num1[str1.charAt(i) - 'A']++;
num2[str2.charAt(i) - 'A']++;
num3[str3.charAt(i) - 'A']++;
}
for (int i = 0; i < letter_count; i++) {
if (num1[i] + num2[i] < num3[i])
flag = false;
commonS1S3 += Math.min(num1[i], num3[i]);
commonS2S3 += Math.min(num2[i], num3[i]);
}
if (2 * commonS1S3 < str1.length() || 2 * commonS2S3 < str1.length())
flag = false;
if (flag)
flag = backTracking(str3, num1, num2, 0, 0, 0);
if (flag)
System.out.println("YES");
else
System.out.println("No");
}
atcoder之A Great Alchemist的更多相关文章
- Atcoder ABC138
Atcoder ABC138 A .Red or Not 一道网速题. 大于3200输出原字符串,否则就输出red. #include<iostream> #include<cstd ...
- A Great Alchemist
Time limit : 2sec / Stack limit : 256MB / Memory limit : 256MB ProblemCarol is a great alchemist. In ...
- AtCoder Regular Contest 061
AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...
- AtCoder Grand Contest 001 C Shorten Diameter 树的直径知识
链接:http://agc001.contest.atcoder.jp/tasks/agc001_c 题解(官方): We use the following well-known fact abou ...
- AtCoder Regular Contest 082
我都出了F了……结果并没有出E……atcoder让我差4分上橙是啥意思啊…… C - Together 题意:把每个数加1或减1或不变求最大众数. #include<cstdio> #in ...
- AtCoder Regular Contest 069 D
D - Menagerie Time limit : 2sec / Memory limit : 256MB Score : 500 points Problem Statement Snuke, w ...
- AtCoder Regular Contest 076
在湖蓝跟衡水大佬们打的第二场atcoder,不知不觉一星期都过去了. 任意门 C - Reconciled? 题意:n只猫,m只狗排队,猫与猫之间,狗与狗之间是不同的,同种动物不能相邻排,问有多少种方 ...
- AtCoder Grand Contest 016
在雅礼和衡水的dalao们打了一场atcoder 然而窝好菜啊…… A - Shrinking 题意:定义一次操作为将长度为n的字符串变成长度n-1的字符串,且变化后第i个字母为变化前第i 或 i+1 ...
- AtCoder Beginner Contest 069【A,水,B,水,C,数学,D,暴力】
A - K-City Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement In K-city, ...
随机推荐
- 远程訪问路由器下的mac os(ssh+vnc)
需求: 使用能够上网的外网pc(win7操作系统).远程訪问公网tp-link下的的mac电脑 环境: mac os -----tp-link-----------pc 工具: putty Tig ...
- 王立平-- android:layout_weight
效果: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzQyNTUyNw==/font/5a6L5L2T/fontsize/400/fill/I0 ...
- 《linux 内核全然剖析》 sys.c 代码分析
sys.c 代码分析 setregid /* * This is done BSD-style, with no consideration of the saved gid, except * th ...
- 在Win7上安装MySql5.2遇到Write configuration file的解决
机器从XP翻新到Win7后,原有的环境也被清除了,因此找了个时间重新安装MySql. 以前轻车熟路的过程,在最后一环却卡住了,出现Write configuration file 错误. 以前从来没有 ...
- asp.net网站项目调用page,或者ashx页面不能用反射
public class TestHandler : System.Web.IHttpHandler { public bool IsReusable { get { return false; } ...
- POJ--2449--Remmarguts' Date【dijkstra_heap+A*】第K短路
链接:http://poj.org/problem?id=2449 题意:告诉你有n个顶点,m条边.并把这些边的信息告诉你:起点.终点.权值.再告诉你s.t.k.需求出s到t的第k短路,没有则输出-1 ...
- Angular CLI的安装及使用
安装命令行 npm install -g @angular/cli 检查命令行 ng v 使用这个命令可以检查 angular cli是否安装成功.我检查的时候发现没有安装成功,提示我使用的node. ...
- 使用curl在命令行中下载文件
http://m.blog.csdn.net/blog/mayadong7349/7019208 使用curl在命令行中下载文件 linux下curl简单应用详解 http://blog.sina.c ...
- PHP高级教程-JSON
PHP JSON 本章节我们将为大家介绍如何使用 PHP 语言来编码和解码 JSON 对象. 环境配置 在 php5.2.0 及以上版本已经内置 JSON 扩展. JSON 函数 函数 描述 json ...
- 子查询三(在FROM子句中使用子查询)
FROM子句中使用子查询一般都是返回多行多列,可以将其当作一张数据表 示例一.查询出每个部门的编号,名称,位置,部门人数,平均工资 SELECT d.deptno,d.dname,d.loc,temp ...