链接:
http://codeforces.com/contest/551/problem/B
交换a中字符的位置,求b,c字符串在a中出现的最多次数
枚举b出现的次数,然后求出c在a中还可以出现的最大次数,求得最多的次数
关键在于如何计算b出现的次数
代码如下:
for(int i = 0;i<26;i++)
if(s1[i])sum = min(sum,ans[i]/s1[i]);
知道了这个就不会超时了啦,我开始就没想到,多做题才是真的呢,每次都可以收获新的技能,加油!
每天进步一点点!
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define nmax 100005
char str[nmax],sub1[nmax],sub2[nmax];
int ans[27],s1[27],s2[28],cnt[27];
int main(void){
scanf("%s%s%s",str,sub1,sub2);
int len = strlen(str),len1 = strlen(sub1),len2= strlen(sub2);
for(int i = 0;i<len;i++)cnt[str[i]-'a']++;
for(int i=0;i<len1;i++)s1[sub1[i]-'a']++;
for(int i=0;i<len2;i++)s2[sub2[i]-'a']++;
int sum = 100000;
int x = 0,y = 0;
for(int i = 0;i<26;i++)if(s1[i])sum = min(sum,cnt[i]/s1[i]);
for(int i = 0;i<=sum;i++){
int t = 100000;
for(int j = 0;j < 26;j++)if(s2[j])t = min(t,(cnt[j]-i*s1[j])/s2[j]);
if(t+i>x+y)x = i, y = t;
}
for(int i = 0;i<x;i++)printf("%s",sub1);
for(int j = 0;j<y;j++)printf("%s",sub2);
for(int i = 0;i < 26;i++){
cnt[i]-=(s1[i]*x+s2[i]*y);
while(cnt[i])putchar('a'+i),cnt[i]--;
}
return 0;
}