AGC022 A-Diverse Word (orden de diccionario, pensamiento)

Título:

Inserte la descripción de la imagen aquí

solución:

1.如果长度<26,那么在末尾添加一个未出现且最小的字符即可.
2.如果长度=26,那么必然有一个位置要变大,
显然优先变大末端的字符才能使得字典序最小,
因此从后往前遍历,
对于位置i,从i+1之后的字符中找到一个比s[i]大的最小字符,
替换s[i]即可.

código:

#include <bits/stdc++.h>
#define int long long
#define PI pair<int,int>
using namespace std;
const int maxm=2e6+5;

void solve(){
    
    
    string s;cin>>s;
    int n=s.size();
    if(n<26){
    
    
        map<char,int>mp;
        for(auto i:s)mp[i]++;
        for(char i='a';i<='z';i++){
    
    
            if(!mp[i]){
    
    
                cout<<s<<i<<endl;
                return ;
            }
        }
    }else{
    
    
        map<char,int>mp;
        mp[s[n-1]]++;
        for(int i=n-2;i>=0;i--){
    
    
            for(char j=s[i]+1;j<='z';j++){
    
    
                if(mp[j]){
    
    
                    for(int k=0;k<i;k++){
    
    
                        cout<<s[k];
                    }
                    cout<<j<<endl;
                    return ;
                }
            }
            mp[s[i]]++;
        }
    }
    cout<<-1<<endl;
}
signed main(){
    
    
    ios::sync_with_stdio(0);
    solve();
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_44178736/article/details/115032305
Recomendado
Clasificación