Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
 Аватар для salvator19
1 / 1 / 1
Регистрация: 28.03.2014
Сообщений: 58

Найти лексикографически минимальный палиндром, который можно получить из слова S

11.07.2014, 13:31. Показов 3925. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У Максима есть слово S, и он очень хочет сделать из него палиндром, но не желает изменять слишлом большое количество символов. Помогите Максиму найти лексикографически минимальный палиндром, который можно получить из слова S заменой не более чем K символов.
Строка A лексикографически меньше строки B, если существует такой индекс j, что A[j] < B[j] и ∀i < j A[i] = B[i]

Входные данные:
Первая строка содержит слово S, состоящее из строчных латинских букв и имеющее длину не более 10^5 символов.
Вторая строка содержит целое число K (0 <= K <= 10^5) — максимально возможное количество замен.

Выходные данные:
В единственной строке выведите ответ на задачу. Если сформировать палиндром невозможно, выведите NO.

Пример: Входные данные: ozoxo
1
Выходные данные:oxoxo
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.07.2014, 13:31
Ответы с готовыми решениями:

Удалить слова, из которых перестановкой букв можно получить палиндром, и продублировать остальные слова
Задание такое: удалить слова, из которых перестановкой букв можно получить палиндром, и продублировать остальные слова. Заранее...

Найти самый длинный палиндром, который можно составить из заданных символов
Игра в карты Недавно мы имели возможность наблюдать за редким явлением. Голубой кровавый супер-месяц - однозначно незабываемое зрелище....

Вывести самый длинный палиндром, который можно составить из данных букв
Игра в карты Недавно мы имели возможность наблюдать за редким явлением. Голубой кровавый супер-месяц - однозначно незабываемое зрелище....

27
2406 / 1938 / 763
Регистрация: 27.07.2012
Сообщений: 5,576
11.07.2014, 15:02
Студворк — интернет-сервис помощи студентам
SlavaSSU, топик-стартер. Как бы в этой теме только нас трое.

Добавлено через 1 минуту
salvator19, возьмите ещё раз последнюю версию моего кода.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/*
У Максима есть слово S, и он очень хочет сделать из него палиндром, 
но не желает изменять слишлом большое количество символов.
Помогите Максиму найти лексикографически минимальный палиндром,
который можно получить из слова S заменой не более чем K символов.
Строка A лексикографически меньше строки B, если существует такой
индекс j, что A[j] < B[j] и i < j A[i] = B[i]
 
Входные данные:
Первая строка содержит слово S, состоящее из строчных латинских букв и имеющее длину не более 10^5 символов.
Вторая строка содержит целое число K (0 <= K <= 10^5) — максимально возможное количество замен.
 
Выходные данные:
В единственной строке выведите ответ на задачу. Если сформировать палиндром невозможно, выведите NO.
*/
 
#include <iostream>
#include <algorithm>
#include <string>
 
int main(void)
{
    std::string input;
    int k;
    std::cout << "Enter String: ";
    std::cin >> input;
    std::cout << "Enter Number Of Substitutions: ";
    std::cin >> k;
 
    std::string first_part(input.begin(), input.begin() + input.size() / 2);
    std::string second_part(input.begin() + input.size() / 2, input.end());
    std::reverse(second_part.begin(), second_part.end());
 
    int n = 0;
    std::string::iterator curr1 = first_part.begin();
    std::string::iterator curr2 = second_part.begin();
    while (curr1 != first_part.end())
    {
        std::pair<std::string::iterator, std::string::iterator> curr =
            std::mismatch(curr1, first_part.end(), curr2);
        curr1 = curr.first;
        curr2 = curr.second;
        if (curr1 != first_part.end())
        {
            ++n;
            if (*curr1 < *curr2)
                *curr2 = *curr1;
            else
                *curr1 = *curr2;
            ++curr1;
            ++curr2;
        }
    }
 
    curr1 = first_part.begin();
    curr2 = second_part.begin();
    while ((n < k - 1) && (curr1 != first_part.end()))
    {
        *curr1++ = 'a';
        *curr2++ = 'a';
        n += 2;
    }
 
    std::cout << "\nResult: ";
    if (n <= k)
    {
        std::reverse(second_part.begin(), second_part.end());
        if ((n < k) && (first_part.size() != second_part.size()))
            second_part[0] = 'a';
        std::cout << first_part << second_part;
    } else
        std::cout << "NO";
    std::cout << std::endl;
 
    system("pause");
    return 0;
}
0
 Аватар для salvator19
1 / 1 / 1
Регистрация: 28.03.2014
Сообщений: 58
11.07.2014, 15:04  [ТС]
John Prick, работает тоже
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
11.07.2014, 15:04
John Prick, как бы в проверяющих системах обычно нельзя смотреть тесты, это был риторический вопрос!
вот ща потестил и нашел тест:
abcddcba
4
ответ
aaaddaaa
твой ответ
aacddcaa

и таких тестов куча...
0
 Аватар для salvator19
1 / 1 / 1
Регистрация: 28.03.2014
Сообщений: 58
11.07.2014, 15:05  [ТС]
SlavaSSU, John Prick, хотите еще порешать задачки))) Попробуйте вникнуть в логику шпионов и рассекретить их переписку. Панграмма
0
2406 / 1938 / 763
Регистрация: 27.07.2012
Сообщений: 5,576
11.07.2014, 15:29
Цитата Сообщение от SlavaSSU Посмотреть сообщение
вот ща потестил и нашел тест:
abcddcba
4
ответ
aaaddaaa
твой ответ
aacddcaa
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/*
У Максима есть слово S, и он очень хочет сделать из него палиндром, 
но не желает изменять слишлом большое количество символов.
Помогите Максиму найти лексикографически минимальный палиндром,
который можно получить из слова S заменой не более чем K символов.
Строка A лексикографически меньше строки B, если существует такой
индекс j, что A[j] < B[j] и i < j A[i] = B[i]
 
Входные данные:
Первая строка содержит слово S, состоящее из строчных латинских букв и имеющее длину не более 10^5 символов.
Вторая строка содержит целое число K (0 <= K <= 10^5) — максимально возможное количество замен.
 
Выходные данные:
В единственной строке выведите ответ на задачу. Если сформировать палиндром невозможно, выведите NO.
*/
 
#include <iostream>
#include <algorithm>
#include <string>
 
int main(void)
{
    std::string input;
    int k;
    std::cout << "Enter String: ";
    std::cin >> input;
    std::cout << "Enter Number Of Substitutions: ";
    std::cin >> k;
    std::cout << "\nResult: ";
 
    std::string first_part(input.begin(), input.begin() + input.size() / 2);
    std::string second_part(input.begin() + input.size() / 2, input.end());
    std::reverse(second_part.begin(), second_part.end());
 
    int n = 0;
    std::string::iterator curr1 = first_part.begin();
    std::string::iterator curr2 = second_part.begin();
    while (curr1 != first_part.end())
    {
        std::pair<std::string::iterator, std::string::iterator> curr =
            std::mismatch(curr1, first_part.end(), curr2);
        curr1 = curr.first;
        curr2 = curr.second;
        if (curr1 != first_part.end())
        {
            ++n;
            if (*curr1 < *curr2)
                *curr2 = *curr1;
            else
                *curr1 = *curr2;
            ++curr1;
            ++curr2;
        }
    }
 
    if (n > k)
        std::cout << "NO";
    else
    {
        curr1 = first_part.begin();
        curr2 = second_part.begin();
        while ((n < k - 1) && (curr1 != first_part.end()))
        {
            if (*curr1 != 'a')
            {
                *curr1 = 'a';
                *curr2 = 'a';
                n += 2;
            }
            ++curr1;
            ++curr2;
        }
 
        std::reverse(second_part.begin(), second_part.end());
        if ((n < k) && (first_part.size() != second_part.size()))
            second_part[0] = 'a';
        std::cout << first_part << second_part;
    }
    std::cout << std::endl;
 
    system("pause");
    return 0;
}
Цитата Сообщение от SlavaSSU Посмотреть сообщение
и таких тестов куча...
Так вот проверить бы все. Мне просто в голову особо не приходят разные варианты.
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
11.07.2014, 15:32
John Prick, dcbc 4(ответ aaaa, твой ответ abba) xD
0
2406 / 1938 / 763
Регистрация: 27.07.2012
Сообщений: 5,576
11.07.2014, 15:47
Ясно. Алгоритм должен быть другим. Просто изначально стал поправлять имеющийся алгоритм под лексикографический минимум.
0
Заблокирован
11.07.2014, 16:30
C++
1
2
3
4
5
6
 string init;
    cin>>init;
    int k = (cin>>k, k), j = 0;
    for (int i = init.size() - 1; i >= std::round(init.size() / 2) && j <= k; i--)
        if (init[i] != init[init.size() - 1 - i]) init[init.size() - 1 - i] = init[j++, i];
    cout << ((j > k) ? "NO" : init);
Добавлено через 38 секунд
Цитата Сообщение от salvator19 Посмотреть сообщение
хочет сделать из него палиндром
Получается, изначально - не полиндром. Для тех кто забывает условие задания.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.07.2014, 16:30

Можно ли удалив 1 символ из строки, получить палиндром?
Sample Input 1: abca Sample Output 1: YES

Определить, можно ли переставить английские буквы заданного предложения, чтобы получить палиндром
На вход программе подается предложение на английском языке, заканчивающееся точкой. Требуется написать программу, которая определяет,...

Вводится слово из файла INPUT.txt. Удалить из слова символы так, чтобы получить палиндром.
вводится слово из файла INPUT.txt. Удалить из слова символы так, чтобы получить палиндром. ответ записать в файл OUTPUT.txt

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

Найти количество слов, которые можно получить перестановкой букв данного слова
Сколько различных слов можно получить перестановкой букв слова &quot;ПРЕЦЕНДЕНТ&quot; - буквы Е не стоят рядом. (в слове намеренно допущена...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru