B. ZgukistringZ

题目链接: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;
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值