• 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;
    }
    

      

  • 相关阅读:
    zabbix proxy配置实战案例
    zabbix agent的主动工作模式实战案例
    使用Zabbix监控Nginx状态页实战案例
    基于Ambari的WebUI部署Storm服务
    Golang的高级数据类型-指针(Pointer)实战篇
    Golang的高级数据类型-结构体(struct)实战篇
    Golang的高级数据类型-字典(map)实战篇
    Golang的高级数据类型-切片(slice)实战篇
    Golang的高级数据类型-数组(array)实战篇
    Golang的异常处理实战篇
  • 原文地址:https://www.cnblogs.com/visualVK/p/8469206.html
Copyright © 2020-2023  润新知