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

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

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

Author24 — интернет-сервис помощи студентам
У Максима есть слово 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.07.2014, 13:31
Ответы с готовыми решениями:

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

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

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

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

27
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
11.07.2014, 13:52 2
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
/*
У Максима есть слово 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;
            *curr1 = *curr2;
            ++curr1;
            ++curr2;
        }
    }
 
    std::cout << "\nResult: ";
    if (n <= k)
    {
        std::reverse(second_part.begin(), second_part.end());
        std::cout << first_part << second_part;
    } else
        std::cout << "NO";
    std::cout << std::endl;
 
    system("pause");
    return 0;
}
1
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
11.07.2014, 14:11 3
John Prick, неправильно работает. я ввел ему abc 2, ответ aaa, у тебя вывел cbc.
1
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
11.07.2014, 14:22 4
Цитата Сообщение от SlavaSSU Посмотреть сообщение
я ввел ему abc 2, ответ aaa, у тебя вывел cbc.
Почему ответ именно aaa, а не, к примеру, aba , ccc или bbb?

Добавлено через 6 минут
Воткнул. Забыл про лексографическую минимальность.
Тогда пара исправлений:
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
/*
У Максима есть слово 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;
        }
    }
 
    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;
}
1
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
11.07.2014, 14:26 5
Лучший ответ Сообщение было отмечено salvator19 как решение

Решение

John Prick, неправильно на тесте bbbb 3(Ответ видимо abba, у тя выводит bbbb)
да и на тесте bbbb 4 утя выводит bbbb хотя должен aaaa
1
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
11.07.2014, 14:36 6
Лучший ответ Сообщение было отмечено salvator19 как решение

Решение

SlavaSSU, ну тогда доработай сам.

Добавлено через 1 минуту
Надо просто добавить ещё один цикл на оставшееся число замен и менять символы в первой и второй на 'a'.

Добавлено через 1 минуту
Ладно, сам сделаю.
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)
    {
        *curr1++ = 'a';
        *curr2++ = 'a';
        ++n;
    }
 
    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;
}
1
1 / 1 / 1
Регистрация: 28.03.2014
Сообщений: 58
11.07.2014, 14:38  [ТС] 7
John Prick, SlavaSSU, Спасибо.
0
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
11.07.2014, 14:40 8
salvator19, погоди, посл.вариант нерабочий.
0
1 / 1 / 1
Регистрация: 28.03.2014
Сообщений: 58
11.07.2014, 14:41  [ТС] 9
John Prick, уже вижу)
0
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
11.07.2014, 14:41 10
Вот рабочий вариант:
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;
}
1
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
11.07.2014, 14:44 11
John Prick, ЛОЛ. на тесте bbbb 3 выводит aaaa(т.е. он сделал 4 замены)

ладно щас погоди я попробую написать и тогда ты уже будешь заваливать меня тестами!)
0
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
11.07.2014, 14:45 12
Теперь, вроде правильно работает.

Добавлено через 17 секунд
SlavaSSU, я исправил это.
0
1 / 1 / 1
Регистрация: 28.03.2014
Сообщений: 58
11.07.2014, 14:50  [ТС] 13
John Prick, Большое спасибо!

Добавлено через 3 минуты
John Prick, не проходит еще один тест) не хватает чего то еще
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
11.07.2014, 14:52 14
salvator19, попробуй пошли мой код.

C++ (Qt)
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
#include <iostream>
#include <algorithm>
#include <string>
 
using namespace std;
 
char a[111111];
bool used[111111];
 
int main()
{
    string s;
    getline(cin, s);
    int n = s.length();
    int k;
    cin >> k;
    for(int i = 0; i < n; i++)
        a[i + 1] = s[i];
 
    for(int i = 1; i <= n / 2; i++)
    {
        if(a[i] != a[n - i + 1])
        {
            char mn = min(a[i], a[n - i + 1]);
            a[i] = a[n - i + 1] = mn;
            used[i] = used[n - i + 1] = true;
            k--;
        }
    }
 
    if(k < 0)
    {
        cout << "NO" << endl;
        return 0;
    }
 
    for(int i = 1; i <= n / 2; i++)
    {
        if(a[i] > 'a')
        {
            if(!used[i])
            {
                if(k >= 2)
                {
                    k -= 2;
                    a[i] = a[n - i + 1] = 'a';
                }
            }
            else
            {
                if(k >= 1)
                {
                    k--;
                    a[i] = a[n - i + 1] = 'a';
                }
            }
        }
    }
 
    if(n % 2 == 1)
    {
        if(a[(n / 2) + 1] != 'a' && k > 0)
        {
            k--;
            a[(n / 2) + 1] = 'a';
        }
    }
 
    string ans;
    ans.erase();
    for(int i = 1; i <= n; i++)
        ans += a[i];
 
    cout << ans << endl;
    return 0;
}
1
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
11.07.2014, 14:56 15
Цитата Сообщение от salvator19 Посмотреть сообщение
не проходит еще один тест
Какой?
0
1 / 1 / 1
Регистрация: 28.03.2014
Сообщений: 58
11.07.2014, 14:56  [ТС] 16
SlavaSSU, твой прошел! Спасибо

Добавлено через 29 секунд
John Prick, там дальше не видно тестов. но походу этот bbbb 3
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
11.07.2014, 14:58 17
salvator19, а что за сайт кстати?
0
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
11.07.2014, 14:58 18
Цитата Сообщение от salvator19 Посмотреть сообщение
там дальше не видно тестов. но походу этот bbbb 3
Выдаёт abba. А какой должен быть ответ?
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
11.07.2014, 15:00 19
John Prick, ответ abba да. Кто вам сказал, что решение падает именно на этом тесте?
0
1 / 1 / 1
Регистрация: 28.03.2014
Сообщений: 58
11.07.2014, 15:01  [ТС] 20
John Prick, вводим bbbb и 3 замены. Он делал 4 замены aaaa
0
11.07.2014, 15:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.07.2014, 15:01
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru