Аватар для salvator19
1 / 1 / 1
Регистрация: 28.03.2014
Сообщений: 58

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

11.07.2014, 13:31. Показов 3957. Ответов 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
2410 / 1942 / 764
Регистрация: 27.07.2012
Сообщений: 5,578
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
2410 / 1942 / 764
Регистрация: 27.07.2012
Сообщений: 5,578
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
2410 / 1942 / 764
Регистрация: 27.07.2012
Сообщений: 5,578
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru