Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
salvator19
 Аватар для salvator19
1 / 1 / 0
Регистрация: 28.03.2014
Сообщений: 50
11.07.2014, 13:31     Найти лексикографически минимальный палиндром, который можно получить из слова S #1
У Максима есть слово 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.07.2014, 13:31     Найти лексикографически минимальный палиндром, который можно получить из слова S
Посмотрите здесь:

C++ Можно ли из слова А получить слово Б
В матрице найти минимальный элемент. Получить матрицу порядка n+1 C++
C++ Имеются слова доноры (из монитор можно получить мотор, рот, тир )
Дан одномерный целочисленный массив. Определить, можно ли получить из данной последовательности симметричную (палиндром) путем перестановки в исходной C++
C++ Проверьте, можно ли вычеркиванием букв из одного слова получить другое
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
11.07.2014, 15:02     Найти лексикографически минимальный палиндром, который можно получить из слова S #21
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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
salvator19
 Аватар для salvator19
1 / 1 / 0
Регистрация: 28.03.2014
Сообщений: 50
11.07.2014, 15:04  [ТС]     Найти лексикографически минимальный палиндром, который можно получить из слова S #22
John Prick, работает тоже
SlavaSSU
213 / 158 / 44
Регистрация: 17.07.2012
Сообщений: 580
11.07.2014, 15:04     Найти лексикографически минимальный палиндром, который можно получить из слова S #23
John Prick, как бы в проверяющих системах обычно нельзя смотреть тесты, это был риторический вопрос!
вот ща потестил и нашел тест:
abcddcba
4
ответ
aaaddaaa
твой ответ
aacddcaa

и таких тестов куча...
salvator19
 Аватар для salvator19
1 / 1 / 0
Регистрация: 28.03.2014
Сообщений: 50
11.07.2014, 15:05  [ТС]     Найти лексикографически минимальный палиндром, который можно получить из слова S #24
SlavaSSU, John Prick, хотите еще порешать задачки))) Попробуйте вникнуть в логику шпионов и рассекретить их переписку. Панграмма
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
11.07.2014, 15:29     Найти лексикографически минимальный палиндром, который можно получить из слова S #25
Цитата Сообщение от 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 Посмотреть сообщение
и таких тестов куча...
Так вот проверить бы все. Мне просто в голову особо не приходят разные варианты.
SlavaSSU
213 / 158 / 44
Регистрация: 17.07.2012
Сообщений: 580
11.07.2014, 15:32     Найти лексикографически минимальный палиндром, который можно получить из слова S #26
John Prick, dcbc 4(ответ aaaa, твой ответ abba) xD
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
11.07.2014, 15:47     Найти лексикографически минимальный палиндром, который можно получить из слова S #27
Ясно. Алгоритм должен быть другим. Просто изначально стал поправлять имеющийся алгоритм под лексикографический минимум.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2014, 16:30     Найти лексикографически минимальный палиндром, который можно получить из слова S
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Trwsdf
Заблокирован
11.07.2014, 16:30     Найти лексикографически минимальный палиндром, который можно получить из слова S #28
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 Посмотреть сообщение
хочет сделать из него палиндром
Получается, изначально - не полиндром. Для тех кто забывает условие задания.
Yandex
Объявления
11.07.2014, 16:30     Найти лексикографически минимальный палиндром, который можно получить из слова S
Ответ Создать тему
Опции темы

Текущее время: 03:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru