Codeforces Round # 607 (Div. 2) B. Azamon Web Services

Ссылка:

https://codeforces.com/contest/1281/problem/B

Значение вопросов:

Ваш друг Джефф Zebos пытается запустить свой новый интернет-компанию, но это не очень хорошо. Он не получает много продаж на своем сайте, который он решил назвать Azamon. Его большая проблема, вы думаете, что он не занимая достаточно высоко на поисковых системах. Если бы только он мог переименовать свою продукцию, чтобы иметь лучшие имена, чем его конкуренты, то он будет в верхней части результатов поиска и будет миллионером.

После выполнения некоторых исследований, вы узнаете, что поисковые системы только сортировать их результаты лексически. Если ваш друг мог бы переименовать свою продукцию в лексикографический меньшие строки, чем его конкурент, то он будет на вершине рейтинга!

Чтобы сделать вашу стратегию менее очевидной для его конкурентов, вы решили поменять местами не более двух букв названий продуктов.

Пожалуйста, помогите Джеф найти улучшенные названия для своих продуктов, которые лексикографически меньше, чем его конкурент!

Учитывая изображающее название продукта Джеффа и строку гр, представляющего название продукта своего конкурента строка s, найти путь к обмену на более одной паре символов в сек (то есть, найти два различные индексов и J и подкачки си и SJ) такое, что полученное новое имя становится строго лексически меньше, чем с, или определить, что это невозможно.

Примечание: String строго лексически меньше, чем строка б тогда и только тогда, когда один из следующих условий:

а является собственным префиксом Ь, то есть является префиксом Ь, что A ≠ B;
Там существует целое 1≤i≤min (| A |, | B |) , такие , что а <би и Aj = Ь для 1≤j <я.

Идеи:

От передней к задней части, чтобы найти значение меньше, чем за его позиции, своп, чтобы получить наименьший лексикографически

Код:

#include<bits/stdc++.h>
using namespace std;

string s, c;

int main()
{
    int t;
    scanf("%d", &t);
    while(t--)
    {
        cin >> s >> c;
        for (int i = 0;i < (int)s.length();i++)
        {
            int tmp = i;
            for (int j = s.length()-1;j >= i;j--)
                if (s[j] < s[tmp]) tmp = j;
            if (tmp != i)
            {
                swap(s[tmp], s[i]);
                break;
            }
        }
        if (s < c)
            cout << s << endl;
        else
            cout << "---" << endl;
    }

    return 0;
}

рекомендация

отwww.cnblogs.com/YDDDD/p/12104850.html