codeforce round#466(div.2)C. Phone Numbers

C. Phone Numbers
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
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 abec, afa is not lexicographically 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
inputCopy
3 3
abc
output
aca
inputCopy
3 2
abc
output
ac
inputCopy
3 3
ayy
output
yaa
inputCopy
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: aaa, aab, aac, aba, abb, abc, aca, acb, .... Among them, those are lexicographically greater than abc: aca, acb, .... Out of those the lexicographically smallest is aca.

  题目大意:给一个长度为n的字符串S,输出一个大于S的字典序的字符串中字典序最小的长度为k的字符串(考试的时候硬是没看懂T.T一直以为输出字典序最小的字符串)

  分析:如果k<=n只用从后往前赋值,如果可以找到一个比该位字符字典序大,ans[i]=x,该位前面的直接等于ans[j]=s[j](j=i-1,j>=0,j--)即可,否则,ans[i]=min(s)(字符串s中最小的字母);

  如果k>n,i<=n时,ans[i]=s[i];i>n,ans[i]=min(s);

  

#define debug
#include<stdio.h>
#include<math.h>
#include<cmath>
#include<queue>
#include<stack>
#include<string>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<functional>
#include<iomanip>
#include<map>
#include<set>
#define pb push_back
using namespace std;
typedef long long ll;
pair<ll,ll>PLL;
pair<int,ll>Pil;
const int INF = 0x3f3f3f3f;
const double inf=1e8+100;
const ll maxn =1e5+100;
const int N = 1e4+10;
const ll mod=1000007;
vector<int>v;
char s[maxn],ans[maxn];
int n,k;
bool flag;
void solve() {
	int i,j,t=1;
	//cin>>t;
	while(t--) {
		flag=0;
		vector<int>::iterator it;
		cin>>n>>k>>s;
	//	cout<<n<<" "<<s<<" "<<k<<endl;
		for(i=0; i<n; i++) {
			v.pb(s[i]-'a');
		}
		sort(v.begin(),v.end());
		v.erase(unique(v.begin(),v.end()),v.end());
		for(i=k-1; i>=0; i--) {
			if(k<=n) {
				if(flag){
					ans[i]=s[i];
					continue;
				}
				int t=s[i]-'a';
				it=upper_bound(v.begin(),v.end(),t);
				if(it==v.end()) {
					ans[i]=v[0]+'a';
			//		cout<<ans[i]<<" k<=n ";
				} else {
					ans[i]=*it+'a';
			//		cout<<ans[i]<<" k<=n ";
					flag=1;
				}
			} else {
				if(flag) {
					ans[i]=s[i];
			//		cout<<ans[i]<<" k>n ";
				} else {
					for(;i>=n;i--){
						ans[i]=v[0]+'a';
					//	cout<<ans[i]<<" k>n ";
					}
					flag=1;
					i++;//这里不要写落了 
				}
			}
		}
	//	cout<<endl;
		cout<<ans<<endl;
	//	v.clear();
	//	memset(ans,'',sizeof(ans));
	}
}


int main() {
	ios_base::sync_with_stdio(false);
#ifdef debug
	freopen("in.txt", "r", stdin);
//	freopen("out.txt","w",stdout);
#endif
	cin.tie(0);
	cout.tie(0);
	solve();
	return 0;
}

  

原文地址:https://www.cnblogs.com/visualVK/p/8469206.html