zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    uva 147 Dollars
    hdu 2069 Coin Change(完全背包)
    hdu 1708 Fibonacci String
    hdu 1568 Fibonacci
    hdu 1316 How Many Fibs?
    poj 1958 Strange Towers of Hanoi
    poj 3601Tower of Hanoi
    poj 3572 Hanoi Tower
    poj 1920 Towers of Hanoi
    筛选法——素数打表
  • 原文地址:https://www.cnblogs.com/visualVK/p/8469206.html
Copyright © 2011-2022 走看看