CodeForces - 794C. Naming Company(博弈+模拟)

C. Naming Company

time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

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 n letters (which might contain multiple copies of the same letter, the sets can be different). Initially, the company name is denoted by n question 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

Copy

tinkoff
zscoder

Output

Copy

fzfsirk

Input

Copy

xxxxxx
xxxxxx

Output

Copy

xxxxxx

Input

Copy

ioi
imo

Output

Copy

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.

题目大意:有两个有两个长度相同的字符串,共同来创造一个新的和原来长度相同的字符串,第一个人想使得新的字符串字典序尽量小,第二个人想尽量大,每人每次只能用自己的字符填一次,每个字符只能用一次,让你输出最后得到的那个字符串。

解题思路:先把第一个字符串从小到大排序,第二个从大到小排,运用博弈的思想来模拟,整个博弈过程存在两种情况

1:第一个人有比第二个人小的字符(第二个人有比第一个人大得字符),此时,第一个人一定会使用小的那个字符来放靠前的位置,第二个人会用大得那个放靠前得位置。

2:第一个人没有比第二个人小的字符(第二个人没有比第一个人大得字符),第一个人为了使得字符串小,他会把自己最大得那个字符放在字符串末尾,第二个人则会把他最小得放在末尾。

先找出两个人各自用到字符串的位置,在对于两种情况模拟即可。

AC代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<string>
#include<math.h>
#include<cstdlib>
#include<stdlib.h>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<deque>
#define bug printf("*********\n");
#define mem0(a) memset(a, 0, sizeof(a));
#define mem1(a) memset(a, -1, sizeof(a));
#define finf(a, n) fill(a, a+n, INF);
#define in1(a) scanf("%d" ,&a);
#define FIN freopen("C://Users//Ёбнд©║//Desktop//in.txt","r",stdin);
#define in2(a, b) scanf("%d%d", &a, &b);
#define in3(a, b, c) scanf("%d%d%d", &a, &b, &c);
#define out1(a) printf("%d\n", a);
#define out2(a, b) printf("%d %d\n", a, b);
#define pb(G, a, b) G[a].push_back(b);
using namespace std;
typedef long long LL;
typedef unsigned long long uLL;
typedef pair<LL, pair<int, LL> > LLppar;
typedef pair<int, int> par;
typedef pair<LL, int> LLpar;
const int mod = 1e9+7;
const LL INF = 1e9+7;
const int N = 1010;
const double pi = 3.1415926;

string s1, s2;
char str[300010];

bool cmp(char a, char b)
{
    return a > b;
}

int main()
{
    //FIN;
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>s1>>s2;
    sort(s1.begin(), s1.end());
    sort(s2.begin(), s2.end(), cmp);
    int len = s1.length();
    int l1 = 0, l2 = 0, r1 = (len+1)/2 - 1, r2 = len/2 - 1, l = 0, r = len-1;
    for(int i = 0; i < len; i ++) {
        if(s1[l1] >= s2[l2]) { //情况2
            if(i%2 == 0) {
                str[r --] = s1[r1 --];
            }else str[r --] = s2[r2 --];
        }else {
            if(i%2 == 0) { //情况1
                str[l ++] = s1[l1 ++];
            }else str[l ++] = s2[l2 ++];
        }
    }
    str[len] = '\0';
    cout <<str <<endl;
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值