zoukankan      html  css  js  c++  java
  • 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 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。看了同学的代码,在执行回溯前执行一些检查就能过了。哎。

     1 #include <iostream>
     2 #include <string>
     3 #include <vector>
     4 using namespace std;
     5 
     6 bool backtrack(string &S3, int charsFromS1, int charsFromS2, int current, 
     7         vector<int> &charsInS1, vector<int> &charsInS2) {
     8     if (current >= S3.length()) return true;
     9     char index = S3[current] - 'A';
    10     if (charsInS1[index] > 0 && charsFromS1 < S3.length() / 2) {
    11         charsInS1[index]--;
    12         if (backtrack(S3, charsFromS1 + 1, charsFromS2, current + 1, charsInS1, charsInS2)) return true;
    13         charsInS1[index]++;
    14     }
    15     if (charsInS2[index] > 0 && charsFromS2 < S3.length() / 2) {
    16         charsInS2[index]--;
    17         if (backtrack(S3, charsFromS1, charsFromS2 + 1, current + 1, charsInS1, charsInS2)) return true;
    18         charsInS2[index]++;
    19     }
    20     return false;
    21 }
    22 
    23 int main(int argc, char** argv) {
    24     string S1, S2, S3;
    25     cin >> S1 >> S2 >> S3;
    26     vector<int> charsInS1(26, 0), charsInS2(26, 0), charsInS3(26, 0);
    27 
    28     for (int i = 0; i < S1.length(); ++i) {
    29         charsInS1[S1[i] - 'A']++;
    30         charsInS2[S2[i] - 'A']++;
    31         charsInS3[S3[i] - 'A']++;
    32     }
    33 
    34     int common13 = 0, common23 = 0;
    35     for (int i = 0; i < 26; ++i) {
    36         if (charsInS3[i] > charsInS1[i] + charsInS2[i]) {
    37             cout << "NO" << endl;
    38             return 0;
    39         }
    40         common13 += min(charsInS3[i], charsInS1[i]);
    41         common23 += min(charsInS3[i], charsInS2[i]);
    42     }
    43 
    44     if (common13 < S3.length() / 2 || common23 < S3.length() / 2) {
    45         cout << "NO" << endl;
    46     } else {
    47         bool ans = backtrack(S3, 0, 0, 0, charsInS1, charsInS2);
    48         cout << (ans ? "YES" : "NO") << endl;
    49     }
    50     return 0;
    51 }
  • 相关阅读:
    【程序15】成绩>=90分用A表示,60-89分用B表示, 60分以下用C表示。
    【程序13】打印出所有的“水仙花数”,运算符和表达式
    cacti安装
    lamp安装
    虚拟机克隆之后网络重启失败
    Linux 标准输入输出、重定向
    /etc/crontab和crontab -e的区别
    nginx安装
    【程序11】有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,问每个月的兔子总数为多少?
    【程序9】输出国际象棋棋盘
  • 原文地址:https://www.cnblogs.com/linyx/p/4067955.html
Copyright © 2011-2022 走看看