C. Naming Company

来源:互联网 发布:数控外圆磨床怎么编程 编辑:程序博客网 时间:2024/06/06 12:52

题目链接:点击打开链接

Oleg the client and Igor the analyst are good friends. However, sometimes they argue over little things. Recently, they started a new company, but they are having trouble finding a name for the company.

To settle this problem, they've decided to play a game. The company name will consist of n letters. Oleg and Igor each have a set of nletters (which might contain multiple copies of the same letter, the sets can be different). Initially, the company name is denoted by nquestion marks. Oleg and Igor takes turns to play the game, Oleg moves first. In each turn, a player can choose one of the letters c in his set and replace any of the question marks with c. Then, a copy of the letter c is removed from his set. The game ends when all the question marks has been replaced by some letter.

For example, suppose Oleg has the set of letters {i, o, i} and Igor has the set of letters {i, m, o}. One possible game is as follows :

Initially, the company name is ???.

Oleg replaces the second question mark with 'i'. The company name becomes ?i?. The set of letters Oleg have now is {i, o}.

Igor replaces the third question mark with 'o'. The company name becomes ?io. The set of letters Igor have now is {i, m}.

Finally, Oleg replaces the first question mark with 'o'. The company name becomes oio. The set of letters Oleg have now is {i}.

In the end, the company name is oio.

Oleg wants the company name to be as lexicographically small as possible while Igor wants the company name to be as lexicographically large as possible. What will be the company name if Oleg and Igor always play optimally?

A string s = s1s2...sm is called lexicographically smaller than a string t = t1t2...tm (where s ≠ t) if si < ti where i is the smallest index such that si ≠ ti. (so sj = tj for all j < i)

Input

The first line of input contains a string s of length n (1 ≤ n ≤ 3·105). All characters of the string are lowercase English letters. This string denotes the set of letters Oleg has initially.

The second line of input contains a string t of length n. All characters of the string are lowercase English letters. This string denotes the set of letters Igor has initially.

Output

The output should contain a string of n lowercase English letters, denoting the company name if Oleg and Igor plays optimally.

Examples
input
tinkoffzscoder
output
fzfsirk
input
xxxxxxxxxxxx
output
xxxxxx
input
ioiimo
output
ioi
Note

One way to play optimally in the first sample is as follows :

  • Initially, the company name is ???????.
  • Oleg replaces the first question mark with 'f'. The company name becomes f??????.
  • Igor replaces the second question mark with 'z'. The company name becomes fz?????.
  • Oleg replaces the third question mark with 'f'. The company name becomes fzf????.
  • Igor replaces the fourth question mark with 's'. The company name becomes fzfs???.
  • Oleg replaces the fifth question mark with 'i'. The company name becomes fzfsi??.
  • Igor replaces the sixth question mark with 'r'. The company name becomes fzfsir?.
  • Oleg replaces the seventh question mark with 'k'. The company name becomes fzfsirk.

For the second sample, no matter how they play, the company name will always be xxxxxx.



第一场cf,卡在c题,昨天尝试两次,今天才A到。


总体感觉CF还是很好的,从规则到题目,结束后还可以看每组测试数据,就是听说偶尔会有俄式英语,无所谓啊,反正我也看不懂。


c题的题意是,两个人手里各有一串长度相同的字符串,他俩要拼成一个新的同长度的字符串,每次每人提供一个字符,可以放在任何位置,第一个想字典序升序,第二个想字典序降序。

贪心问题。首先将两个字符串分别排序,只需要取前s/2就可以,后面的可以不做判断。

如果第一个人的字符小于第二个人的,那么他俩完全可以按顺序放置,这样他们的要求都能最大化的满足。

若是第一个人的字符大于第二个人,他肯定要放最后面,因为他想升序嘛,那第二个人也肯定要放在他放置的前面,达到最大的可能降序。

然后,就是处理三个字符串的下标。s,e记录最终数组的下标,alen1,blen1记录开始下标,alen2,blen2记录结束下标,注意此处的结束下标应该是s/2或s/2加1,而不是s,因为每个人最多放s/2加1的字符,我就因此数次WA。

最后输出最终的字符串。


代码实现:

#include<iostream>#include<cstring>#include<algorithm>using namespace std;int cmp1(char a,char b)   //升序 {return a<b;}int cmp2(char a,char b)   //降序 {return a>b; }int main(){char a[300005],b[300005],map[300005];int n,i,alen1,alen2,blen1,blen2,s,e;while(cin>>a>>b){n=strlen(a);sort(a,a+n,cmp1);sort(b,b+n,cmp2);alen1=0;alen2=n%2==0?n/2:n/2+1;alen2--;   //a先放,如果a是单数,则a多放一个 blen1=0;blen2=n/2-1;s=0,e=n-1;for(i=0;i<n;i++){if(i%2==0)    //a放 {if(a[alen1]<b[blen1])    //a字符大于b的字符 {map[s++]=a[alen1++]; //按顺序排放 }else{map[e--]=a[alen2--];  //放在新字符串的最尾部 }}else    //b放 {if(b[blen1]>a[alen1])   //b字符大于a字符 {map[s++]=b[blen1++];  //按顺序排放 }else{map[e--]=b[blen2--];  //放在新字符串最尾部,即a放字符的前一个位置 }}}map[n]='\0';cout<<map<<endl;}return 0;}



0 0
原创粉丝点击