2018/2/25训练日记 Codeforces Round #466 (Div. 2) C,D

昨天的cf掉了五十多分吧 QAQ 终测一个题没挂蛮开心的

Codeforces Round #466 (Div. 2)

C题

And where the are the phone numbers?

You are given a string s consisting of lowercase English letters and an integer k. Find the lexicographically smallest string t of length k, such that its set of letters is a subset of the set of letters of s and s is lexicographically smaller than t.

It's guaranteed that the answer exists.

Note that the set of letters is a set, not a multiset. For example, the set of letters of abadaba is {a, b, d}.

String p is lexicographically smaller than string q, if p is a prefix of q, is not equal to q or there exists i, such that pi < qi and for all j < i it is satisfied that pj = qj. For example, abc is lexicographically smaller than abcd , abd is lexicographically smaller than abecafa is notlexicographically smaller than ab and a is not lexicographically smaller than a.

Input

The first line of input contains two space separated integers n and k (1 ≤ n, k ≤ 100 000) — the length of s and the required length of t.

The second line of input contains the string s consisting of n lowercase English letters.

Output

Output the string t conforming to the requirements above.

It's guaranteed that the answer exists.

Examples
input
Copy
3 3
abc
output
aca
input
Copy
3 2
abc
output
ac
input
Copy
3 3
ayy
output
yaa
input
Copy
2 3
ba
output
baa
Note

In the first example the list of strings t of length 3, such that the set of letters of t is a subset of letters of s is as follows: aaaaabaacabaabbabcacaacb.... Among them, those are lexicographically greater than abcacaacb.... Out of those the lexicographically smallest is aca.


题意呢就是给定字符串和要求的字符串长度   输出一个满足要求的字符串

如果p是q的前缀,不等于q或存在i,使得pi <qi并且对于所有j <i,满足pj = qj,则字符串p按字典顺序小于字符串q。


#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
#define ll long long int
int main()
{
	int n, k;
	bool s[33];
	char res[100100];
	while (cin >> n >> k)
	{
		memset(s, 0, sizeof(s));
		for (int i = 0; i < n; i++)
		{
			cin >> res[i];
			s[res[i] - 'a'] = 1;
		}
		char mx = 'a';
		char mn = 'z';
		for (int i = 0; i < 26; i++)
		if (s[i])
		{
			if ('a' + i>mx)
				mx = 'a' + i;
			if ('a' + i < mn)
				mn = 'a' + i;
		}
		if (n < k)
		{
			for (int i = n; i < k; i++)
				res[i] = mn;
			for (int i = 0; i < k; i++)
				cout << res[i];
			cout << endl;
		}
		else
		{
			int cmp = 0;
			for (int i = k - 1; i >= 0;i--)
			if (res[i] != mx)
			{
				cmp = i;
				break;
			}
			for (int i = res[cmp] - 'a'+1; i < 26;i++)
			if (s[i])
			{
				res[cmp] = i + 'a';
				break;
			}
			for (int i = cmp + 1; i < k; i++)
				res[i] = mn;
			for (int i = 0; i < k; i++)
				cout << res[i];
			cout << endl;
		}
	}
	return 0;
}



D题

We've tried solitary confinement, waterboarding and listening to Just In Beaver, to no avail. We need something extreme."

"Little Alena got an array as a birthday present..."

The array b of length n is obtained from the array a of length n and two integers l and r (l ≤ r) using the following procedure:

b1 = b2 = b3 = b4 = 0.

For all 5 ≤ i ≤ n:

  • bi = 0 if ai, ai - 1, ai - 2, ai - 3, ai - 4 > r and bi - 1 = bi - 2 = bi - 3 = bi - 4 = 1
  • bi = 1 if ai, ai - 1, ai - 2, ai - 3, ai - 4 < l and bi - 1 = bi - 2 = bi - 3 = bi - 4 = 0
  • bi = bi - 1 otherwise

You are given arrays a and b' of the same length. Find two integers l and r (l ≤ r), such that applying the algorithm described above will yield an array b equal to b'.

It's guaranteed that the answer exists.

Input

The first line of input contains a single integer n (5 ≤ n ≤ 105) — the length of a and b'.

The second line of input contains n space separated integers a1, ..., an ( - 109 ≤ ai ≤ 109) — the elements of a.

The third line of input contains a string of n characters, consisting of 0 and 1 — the elements of b'. Note that they are not separated by spaces.

Output

Output two integers l and r ( - 109 ≤ l ≤ r ≤ 109), conforming to the requirements described above.

If there are multiple solutions, output any of them.

It's guaranteed that the answer exists.

Examples
input
Copy
5
1 2 3 4 5
00001
output
6 15
input
Copy
10
-10 -9 -8 -7 -6 6 7 8 9 10
0000111110
output
-5 5
Note

In the first test case any pair of l and r pair is valid, if 6 ≤ l ≤ r ≤ 109, in that case b5 = 1, because a1, ..., a5 < l.



#include<bits/stdc++.h>
using namespace std;
#define MAX 100005
#define Min(a,b,c,d,e) (min(a,min(b,min(c,min(d,e)))))
#define Max(a,b,c,d,e) (max(a,max(b,max(c,max(d,e)))))
int a[MAX];
string b;

int main(){
    int lo=-1e9;
    int hi=1e9;

    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);

    cin>>b;
    b="0"+b;

    for(int i=5;i<=n;i++){
        if(b[i]==b[i-1]) continue;
        if(b[i-1]=='1' && b[i]=='0') hi=min(hi,Min(a[i],a[i-1],a[i-2],a[i-3],a[i-4])-1);
        else lo=max(lo,Max(a[i],a[i-1],a[i-2],a[i-3],a[i-4])+1);
    }

    cout<<lo<<" "<<hi<<endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值