题目链接:http://codeforces.com/contest/551/problem/B

题目大意:给你三个字符串,s1,s2,s3.  s1任意两个字符串之间可以互相交换。

问,在s1中s2和s3在不重叠的情况下,两个字符串出现的最多次数之和的时候为多少,然后将排完序的字符串输出。

思路:一开始打算用桶排做,将每个字符串中的字符出现的次数记录下来,然后查看每个字符串在s1中出现的次数最多为多少,然后按照最大的输出。结果交上去错了,后来才发现是求s1和s2出现的次数之和的最大值,有可能有如下情况,s1出现的最大次数为3,当s1出现次数为3时,s2的次数为1.但是,当s1出现的次数为2时,这个时候s2的次数为5,显然 3+1 < 2+5 。这个时候就应该先输出2*s1和5*s2.然后又开始改,交上去有一组样例tle了,然后过了断断续续将近两个小时才发下错在哪里,具体原因在下面的代码中解释。

#include<bits/stdc++.h>

using namespace std;

# define inf 0x3f3f3f3f

string s1,s2,s3;

int  index;

int d1,d2;

int s;

int len;

map<char,int>q1;

map<char,int>q2;

map<char,int>q3;//桶排

map<char,int >com;

void judge()

{

    int len=s2.size();

    d1=inf;

    for(int i=0; i<len; i++)

    {

        d1=min(d1,q1[s2[i]]/q2[s2[i]]);//这个地方要注意,和d1比较的是 (q1[s2[i]]/q2[s2[i]]),不能只是比较(d1和q1[s2[i]]),因为s2有可能是由重复字母组成的比如说 s1是‘aaa',s2是'aa',这个时候,如果按照后者的计算的话,答案是3,但是正确答案应该是1.

        //cout<<d1<<endl;

    }

    s=-1;

    int t1,t2;

    index=0;

    for(int j=0; j<=d1; j++)

    {

        t1=0,t2=0;

        t1=j;

        int d=inf;

        for(int i=0; i<26; i++)//这里就是tle的原因,一开始我是按照 s3的长度开始跑的,结果一直tle,在看别人的代码的时候,突然想了一下,如果按照最大的来算的话,s2在s1中出现的次数为十的五次方,如果s3的长度也是十的五次方,这个时候耗时就成了10的十次方了,肯定会超时。

        {

            char temp=char(i+'a');

            if(q3[temp])

            {

                d=min(d,(q1[temp]-j*(q2[temp]))/q3[temp]);

            }

        }

        t2=d;

        if(t1+t2>s)

        {

            s=t1+t2;

            index=t1;

        }

    }

}

int main()

{

    while(cin>>s1>>s2>>s3)

    {

        q1.clear();

        q2.clear();

        q3.clear();

        for(int i=0; i<26; i++)

        {

            char s=char(i+'a');

            // cout<<s<<endl;

            q1[s]=0;

            q2[s]=0;

            q3[s]=0;

        }

        for(int i=0; s1[i]; i++)q1[s1[i]]++;

        for(int i=0; s2[i]; i++)q2[s2[i]]++;

        for(int i=0; s3[i]; i++)q3[s3[i]]++;

        judge();

        for(int i=0; i<index; i++)

        {

            cout<<s2;

        }

        len=s2.size();

        for(int i=0; i<len; i++)

        {

            q1[s2[i]]-=index;

        }

        for(int i=1; i<=s-index; i++)

        {

            cout<<s3;

        }

        len=s3.size();

        int g=s-index;

        for(int i=0; i<len; i++)

        {

            q1[s3[i]]-=g;

        }

        len=s1.size();

        for(int i=0; i<len; i++)

        {

            if(q1[s1[i]])

            {

                cout<<s1[i];

                q1[s1[i]]--;

            }

        }

        cout<<endl;

    }

    return 0;

}

B. ZgukistringZ的更多相关文章

  1. Codeforces Round #307 (Div. 2) B. ZgukistringZ 暴力

    B. ZgukistringZ Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/551/probl ...

  2. 字符串处理/贪心 Codeforces Round #307 (Div. 2) B. ZgukistringZ

    题目传送门 /* 题意:任意排列第一个字符串,使得有最多的不覆盖a/b字符串出现 字符串处理/贪心:暴力找到最大能不覆盖的a字符串,然后在b字符串中动态得出最优解 恶心死我了,我最初想输出最多的a,再 ...

  3. 「日常训练」ZgukistringZ(Codeforces Round #307 Div. 2 B)

    题意与分析(CodeForces 551B) 这他妈哪里是日常训练,这是日常弟中弟. 题意是这样的,给出一个字符串A,再给出两个字符串B,C,求A中任意量字符交换后(不限制次数)能够得到的使B,C作为 ...

  4. 【19.46%】【codeforces 551B】ZgukistringZ

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  5. 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 ...

  6. Codeforces Round #307 (Div. 2)

    A. GukiZ and Contest time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

随机推荐

  1. gbk、utf-8、utf8mb4区别

    1. 存储大小(1). GBK编码专门用来解决中文编码的,是双字节的.不论中英文都是双字节的.(2). UTF-8 编码是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用2 ...

  2. pgm11

    这里简要的讨论 hybrid network 与一些时序数据的分析. hybrid network 指网络中存在离散随机变量与连续随机变量,这种情况下一般非常麻烦,这主要是因为连续型随机变量需要使用某 ...

  3. codeforces 798 D. Mike and distribution

    D. Mike and distribution time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  4. TortoiseSVN 忽略文件 忽略已提交文件

    主要以下两种情况: 1.首次提交就做好了忽略拦截:项目首次提交到svn服务器的时候,把该删的删了,然后设置忽略规则,就没问题了. 2.提交一段时间忽然想忽略拦截:经常碰到的,发现设置忽略规则后,没法生 ...

  5. [hgoi#2019/2/18]比较水

    T1--调换纸牌(card) Alex有 n张纸牌,每张纸牌上都有一个值ai,Alex把这些纸牌排成一排,希望将纸牌按值从小到大的顺序排好.现在他把这个任务交给你,你只能进行一种操作:选中一张牌,然后 ...

  6. for循环实例

    for循环“池理解”[root@localhost ~]# vi showday.sh#!/bin/bashfor TM in "Morning" "Noon" ...

  7. nginx 深入篇

    nginx 防盗链 上文介绍了如何以最最简单的方式配置静态资源,还存在一定的隐患,一般的盗链如何预防, 设置验证referer server { listen 8000; server_name 12 ...

  8. 树莓派上使用DHCPig进行DHCP池耗尽攻击

    安装DHCPig 这个工具依赖Python的Scapy包,如果未安装需要使用pip工具安装. wget https://github.com/kamorin/DHCPig/raw/master/pig ...

  9. 织梦DedeCMS信息发布员发布文章阅读权限不用审核自动开放亲测试通过!

    文章发布员在织梦dedecms后台添加文章时却要超级管理员审核,这无疑是增加了没必要的工作. 登录该账号发布文章你会发现该文章显示的是待审核稿件,且并没有生成静态文件,在前台是看不到这篇文章的,而多数 ...

  10. Code-force 1003 E Tree Constructing

                                                                                                    E. T ...