https://codeforces.com/problemset/problem/551/B
题意:给定a,b,c串。问能在a中选出多少总个数最多的b,c串。
思路:开始想着贪心,发现没法贪心(wa12)。考虑枚举。由于b,c串是定的,所以最开始可以得出主串a给b的最多次数ans,那么然后考虑主串a给c的次数。枚举i:0~ans,然后考虑次数剩余的a串中的数目能最多给c串多少,在过程中更新最值。最后输出。
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=1e5+100;
typedef long long LL;
map<char,LL>map1,map2,map3;
map<char,LL>:: iterator it;
int main(void)
{
string a,b,c;cin>>a>>b>>c;
for(LL i=0;i<a.size();i++){
map1[a[i]]++;
}
for(LL i=0;i<b.size();i++){
map2[b[i]]++;
}
for(LL i=0;i<c.size();i++){
map3[c[i]]++;
}
LL ans=0x3f3f3f3f;//主串能给b串的最多的次数
for(it=map2.begin();it!=map2.end();it++)
{
ans=min(ans,map1[it->first]/(it->second));
}
LL sum1=0;LL sum2=0;LL tot=0;
for(LL i=0;i<=ans;i++)//枚举主串给b串几个
{
map<char,LL>mapnow;
LL res=0x3f3f3f3f;
for(it=map1.begin();it!=map1.end();it++)
{
mapnow[it->first]=(it->second);
}
for(it=map2.begin();it!=map2.end();it++)
{
mapnow[it->first]-=i*(it->second);
}
for(it=map3.begin();it!=map3.end();it++)
{
res=min(res,mapnow[it->first]/(it->second));
}
if(res+i>tot)
{
sum1=i;
sum2=res;
tot=res+i;
}
}
for(LL i=1;i<=sum1;i++){
cout<<b;
}
for(LL i=1;i<=sum2;i++){
cout<<c;
}
for(it=map2.begin();it!=map2.end();it++){
map1[it->first]-=sum1*(it->second);
}
for(it=map3.begin();it!=map3.end();it++){
map1[it->first]-=sum2*(it->second);
}
for(it=map1.begin();it!=map1.end();it++){
for(LL i=1;i<=it->second;i++){
cout<<it->first;
}
}
cout<<endl;
return 0;
}