B. ZgukistringZ-简单字符串处理-Codeforces Round #307 (Div. 2)
2015-08-07 19:24
387 查看
题意:
给出a,b,c三个字符串
可以随意打乱a的顺序,看能构造出最多几个b或c
统计一下a的每个字母的个数,然后对比一下bc就好
给出a,b,c三个字符串
可以随意打乱a的顺序,看能构造出最多几个b或c
统计一下a的每个字母的个数,然后对比一下bc就好
#include <cstring> #include <string> #include <cstdio> #include <algorithm> #include <iostream> #include <queue> #include <map> #include <set> #include <vector> #define inf 0x3f3f3f3f using namespace std; char a[100000+5]; char b[100000+5]; char c[100000+5]; int vis3[26+5]; int vis1[26+5]; int vis2[26+5]; int cal1[26+5]; int cal2[26+5]; int ch(int x) { int i; if (x==1) { for (i=1;i<=26;i++) { if (vis1[i]<vis2[i]) { return 0; } } } else if (x==2) { for (i=1;i<=26;i++) { if (vis1[i]<vis3[i]) { return 0; } } } return 1; } int main() { int i,j,n; scanf("%s",&a); scanf("%s",&b); scanf("%s",&c); for (i=0;i<strlen(a);i++) vis1[a[i]-'a'+1]++; for (i=0;i<strlen(b);i++) vis2[b[i]-'a'+1]++; for (i=0;i<strlen(c);i++) vis3[c[i]-'a'+1]++; int min1=inf; int min2=inf; for (i=1;i<=26;i++) { if (vis1[i]&&vis2[i]) { cal1[i]=vis1[i]/vis2[i]; if (cal1[i]<min1) min1=cal1[i]; } if (vis1[i]==0&&vis2[i]) {min1=0;break;} } int num=min1; //选取min1个b for (i=1;i<=26;i++) { if (vis1[i]&&vis2[i] ) vis1[i]-=vis2[i]*min1;//去掉min1个b } for (i=1;i<=26;i++) { if (vis1[i]&&vis3[i]) { cal2[i]=vis1[i]/vis3[i]; //还能买几个c if (cal2[i]<min2) min2=cal2[i]; } if (vis1[i]==0&&vis3[i]) {min2=0;break;} } if (min2==inf) min2=0; num+=min2; //选取min2个c for (i=1;i<=26;i++) { vis1[i]-=vis3[i]*min2;//去掉min2个c } int num2=num; int min2_best=min2; for (j=1;j<=min1;j++) //每次去掉一个b { num2--; for (i=1;i<=26;i++) { vis1[i]+=vis2[i];//加个b的元素 } while (ch(2)) //如果能选c { num2++; min2++; for (i=1;i<=26;i++) { vis1[i]-=vis3[i];//减个c的元素 } } if (num2>num) { num=num2; min2_best=min2; } } memset(vis1,0,sizeof(vis1)); for (i=0;i<strlen(a);i++) vis1[a[i]-'a'+1]++; min1=num-min2_best; for (i=1;i<=26;i++) { vis1[i]-=(vis2[i]*min1+vis3[i]*min2_best); } for (i=1;i<=min1;i++) printf("%s",b); for (i=1;i<=min2_best;i++) printf("%s",c); for(i=1;i<=26;i++) { while (vis1[i]) { printf("%c",'a'+i-1); vis1[i]--; } } cout<<endl; return 0; }
相关文章推荐
- MySQL使用说明
- 在Linux中创建静态库.a和动态库.so
- 熟人Dubbo 系列1-Dubbo什么
- 在windows 、linux下读取目录下所有文件名
- hdu 5363 Key Set(水)
- javascriptcore.framework学习.
- hdu 5361 In Touch(最短路+并查集)
- 杭电acm 2139 Calculate the formula
- Java IO流--IO包中的其他类
- 【bzoj2141】 排队 树状数组+主席树
- Python简单爬虫
- HDU 5355 Cake(数学 DFS)
- POJ-2136 Vertical Histogram-用*号统计字母个数
- C++(12)STL实践与分析之顺序容器
- Python正则表达式速查表
- hdu 2084 - 数塔(解题报告)
- codeforces Gym 100418D BOPC 打表找规律,求逆元
- java容器类---ArrayList
- 简介BFC
- POJ-1833 排列-字典序