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 S2 then 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|≦100000
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.

用回溯法TLE。看了同学的代码,在执行回溯前执行一些检查就能过了。哎。

 #include <iostream>
#include <string>
#include <vector>
using namespace std; bool backtrack(string &S3, int charsFromS1, int charsFromS2, int current,
vector<int> &charsInS1, vector<int> &charsInS2) {
if (current >= S3.length()) return true;
char index = S3[current] - 'A';
if (charsInS1[index] > && charsFromS1 < S3.length() / ) {
charsInS1[index]--;
if (backtrack(S3, charsFromS1 + , charsFromS2, current + , charsInS1, charsInS2)) return true;
charsInS1[index]++;
}
if (charsInS2[index] > && charsFromS2 < S3.length() / ) {
charsInS2[index]--;
if (backtrack(S3, charsFromS1, charsFromS2 + , current + , charsInS1, charsInS2)) return true;
charsInS2[index]++;
}
return false;
} int main(int argc, char** argv) {
string S1, S2, S3;
cin >> S1 >> S2 >> S3;
vector<int> charsInS1(, ), charsInS2(, ), charsInS3(, ); for (int i = ; i < S1.length(); ++i) {
charsInS1[S1[i] - 'A']++;
charsInS2[S2[i] - 'A']++;
charsInS3[S3[i] - 'A']++;
} int common13 = , common23 = ;
for (int i = ; i < ; ++i) {
if (charsInS3[i] > charsInS1[i] + charsInS2[i]) {
cout << "NO" << endl;
return ;
}
common13 += min(charsInS3[i], charsInS1[i]);
common23 += min(charsInS3[i], charsInS2[i]);
} if (common13 < S3.length() / || common23 < S3.length() / ) {
cout << "NO" << endl;
} else {
bool ans = backtrack(S3, , , , charsInS1, charsInS2);
cout << (ans ? "YES" : "NO") << endl;
}
return ;
}

A Great Alchemist的更多相关文章

  1. atcoder之A Great Alchemist

    C - A Great Alchemist Time limit : 2sec / Stack limit : 256MB / Memory limit : 256MB Problem Carol i ...

  2. A Great Alchemist 最详细的解题报告

    题目来源:A Great Alchemist A Great Alchemist Time limit : 2sec / Stack limit : 256MB / Memory limit : 25 ...

  3. 【翻译】MongoDB指南/CRUD操作(二)

    [原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(二) 主要内容: 更新文档,删除文档,批量写操作,SQL与MongoDB映射图,读隔离(读关 ...

  4. IELTS - Word List 28

    1, The lawsuit is very much o the lawyer's mind. 2, The canteen was absolutely packed. 3, Doctors di ...

  5. 爹地,我找到了!,15个极好的Linux find命令示例

    爹地,我找到了!, 15个极好的Linux find命令示例 英文原文:Daddy, I found it!, 15 Awesome Linux Find Command Examples 标签: L ...

  6. .NET 使用CouchBase 基础篇

    2011年2月,CouchOne和memebase合并后,改名为Couchbase,官网地址(www.couchbase.com).membase最后一个版本为1.7.2,可在Couchbase的官网 ...

  7. English sentence

    For a better environment, we should teach our children to put litter/garbage/trash into dustbin/dust ...

  8. 2016.10.08,英语,《Verbal Advantage》Level1 Unit1-4

    这本书学的很辛苦,总共10个Level,每个Level有5个Unit,每个Unit10个单词,实际上自己差不多一天才能学完1个Unit10个单词.(当然,一天我只能花大约1个小时左右在英语上) 而且跟 ...

  9. 30个实用的Linux find命令

    除了在一个目录结构下查找文件这种基本的操作,你还可以用find命令实现一些实用的操作,使你的命令行之旅更加简易.本文将介绍15种无论是于新手还是老鸟都非常有用的Linux find命令 . 首先,在你 ...

随机推荐

  1. 《DSP using MATLAB》 示例Example4.1

    今天开始看第4章,从开始看这本书到现在,过去一个多月,收获不少,继续坚持.

  2. POJ 1014 Dividing(多重背包)

    Dividing   Description Marsha and Bill own a collection of marbles. They want to split the collectio ...

  3. ccc autotest

    module.exports.assert = function (express,value,msg) { if(express==value) { cc.info("test:" ...

  4. ajax、post、get实例

    html代码: <!DOCTYPE HTML><html lang="en-US"><head> <meta charset=" ...

  5. BZOJ 3110 k大数查询 & 树套树

    题意: 有n个位置,每个位置可以看做一个集合,现在要求你实现一个数据结构支持以下功能: 1:在a-b的集合中插入一个数 2:询问a-b集合中所有元素的第k大. SOL: 调得火大! 李建说数据结构题能 ...

  6. 通过Spring Mail Api发送邮件

    使用Java Mail API来发送邮件也很容易实现,但是最近公司一个同事封装的邮件API实在让我无法接受,于是便打算改用Spring Mail API来发送邮件,顺便记录下这篇文章. [Spring ...

  7. SVN版本控制工具使用学习

    SVN版本控制工具使用学习 Subversion是优秀的版本控制工具. 1.下载和搭建SVN服务器 http://subversion.apache.org/packages.html 类型有5种,推 ...

  8. 【HDU】1846 Brave Game

    http://acm.hdu.edu.cn/showproblem.php?pid=1846 题意:二人博弈,1堆石子每次取1~m个,没有石子可取的输,输出先手胜利还是后手胜利. #include & ...

  9. 第1章 ZigBee协议栈初始化网络启动流程

    作者:宋老师,华清远见嵌入式学院讲师. ZigBee的基本流程:由协调器的组网(创建PAN ID),终端设备和路由设备发现网络以及加入网络. 基本流程:main()->osal_init_sys ...

  10. Delphi中对BCD码的直接支持 (转)

    最近在Delphi下写软件,需要将数据转换为BCD码和将BCD码转换为其它数据类型,从网上搜索了一下,没有发现好的函数,于是就想自定义函数来完成BCD与其它格式的数据转换功能.但最终没有动手写,先查查 ...