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 S1S2S3.
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 S1S2,
    and S3 will be an uppercase English alphabet letter.
  • Each string S1S2 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

  1. AABCCD
  2. ABEDDA
  3. EDDAAA

Output Example 1

  1. YES

You can make EDDAAA by
picking AAD from the first metal, and AED from
the second metal.


Input Example 2

  1. AAAAAB
  2. CCCCCB
  3. AAABCB

Output Example 2

  1. 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的更多相关文章

  1. Atcoder ABC138

    Atcoder ABC138 A .Red or Not 一道网速题. 大于3200输出原字符串,否则就输出red. #include<iostream> #include<cstd ...

  2. A Great Alchemist

    Time limit : 2sec / Stack limit : 256MB / Memory limit : 256MB ProblemCarol is a great alchemist. In ...

  3. AtCoder Regular Contest 061

    AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...

  4. AtCoder Grand Contest 001 C Shorten Diameter 树的直径知识

    链接:http://agc001.contest.atcoder.jp/tasks/agc001_c 题解(官方): We use the following well-known fact abou ...

  5. AtCoder Regular Contest 082

    我都出了F了……结果并没有出E……atcoder让我差4分上橙是啥意思啊…… C - Together 题意:把每个数加1或减1或不变求最大众数. #include<cstdio> #in ...

  6. AtCoder Regular Contest 069 D

    D - Menagerie Time limit : 2sec / Memory limit : 256MB Score : 500 points Problem Statement Snuke, w ...

  7. AtCoder Regular Contest 076

    在湖蓝跟衡水大佬们打的第二场atcoder,不知不觉一星期都过去了. 任意门 C - Reconciled? 题意:n只猫,m只狗排队,猫与猫之间,狗与狗之间是不同的,同种动物不能相邻排,问有多少种方 ...

  8. AtCoder Grand Contest 016

    在雅礼和衡水的dalao们打了一场atcoder 然而窝好菜啊…… A - Shrinking 题意:定义一次操作为将长度为n的字符串变成长度n-1的字符串,且变化后第i个字母为变化前第i 或 i+1 ...

  9. 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, ...

随机推荐

  1. VUE性能优化总结

    1.v-show,v-if 用哪个? 在我来看要分两个维度去思考问题: 第一个维度是权限问题,只要涉及到权限相关的展示无疑要用 v-if, 第二个维度在没有权限限制下根据用户点击的频次选择,频繁切换的 ...

  2. Android之TelephonyManager

    在Android平台中,通过TelephonyManager可以访问与手机通讯相关的信息,比如设备信息.网络信息及SIM卡信息,同时还可以监听电话的相关状态.下面我们通过几个方面来说明Android平 ...

  3. Cognos两种建模工具对于复杂日期维度的处理比较(下)

    本文继Cognos两种建模工具对于复杂日期维度的处理比较(上)之后将介绍一下Cognos中建模工具Transform对复杂日期维度的处理. 二:Transform建模对于复杂日期维度的处理 为了书写效 ...

  4. 微信小程序自定义数据分析试水

    昨晚收到小程序自定义分析的内测邀请,简单试用了一下.说明挺长的,大概是这个意思: 一.定义一系列事件,对其进行统计 事件可以对页面中的这些事件进行追踪 click enterPage leavePag ...

  5. 免费的Bootstrap等待页面的应用模板

    在线演示 本地下载 这是一款适合移动设备的网页模板,它页面干净小巧.有很多新元素在其中,可以自定义动画和特效.非常酷!

  6. Linux清理磁盘空间

    1.首先确定是否是磁盘满了 命令:   df -h 参数说明: -a:列出所有的文件系统,包括系统特有的/proc等文件系统 -k:以KB的容量显示各文件系统 -m:以MB的容量显示各文件系统 -h: ...

  7. SpringMVC上传文件的三种方式(转载)

    直接上代码吧,大伙一看便知 这时:commonsmultipartresolver 的源码,可以研究一下 http://www.verysource.com/code/2337329_1/common ...

  8. Mac Oracle SqlDeveloper 快捷输入

    用惯了 plsql 的快捷输入,换了 Mac Oracle SqlDeveloper反倒是找不到了,翻出去找了几次终于找到 SqlDeveloper -- preferences -- 数据库(dat ...

  9. Redis学习(8)-redis持久化

    内存(兔子):高效,断电数据丢失 硬盘(乌龟):读写速度慢于内存的,断电数据依旧存在 持久化:把数据保存在硬盘上 关系型数据库:MySQL-持久化: 任何操作都是硬盘上,断电以后,硬盘上数据还在. 非 ...

  10. Oracle快速克隆安装

    Oracle的家目录进行快速克隆,对同类型机器配置很高效的! 01.确认你在克隆数据库时,原数据库已经关闭 sqlplus   /   as sysdba; shutdown immediate ; ...