链接:
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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-17 15:11:18