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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
salvator19
1 / 1 / 0
Регистрация: 28.03.2014
Сообщений: 55
#1

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

11.07.2014, 13:31. Просмотров 1233. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.07.2014, 13:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Найти лексикографически минимальный палиндром, который можно получить из слова S (C++):

Дан одномерный целочисленный массив. Определить, можно ли получить из данной последовательности симметричную (палиндром) путем перестановки в исходной - C++
Помогите написать код к данной задаче, пожалуйста Дан одномерный целочисленный массив. Определить, можно ли получить из данной...

Минимальный палиндром на с++ - C++

Можно ли из слова А получить слово Б - C++
Нужно проверить можно ли из слова А получить слово Б. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; using namespace...

Найти в файле все слова, которые можно сложить из букв заданного слова - C++
Дано слово р и файл f.найти в файле f все слова которые можна сложить с букв слова р.

Найти минимальный элемент первой последовательности, который не входит во вторую последовательность - C++
даны две последовательности по 30 целых чисел в каждой. Найти наименьшее среди тех чисел 1-ой последовательности, которые не входят во...

Найти минимальный элемент в динамическом массиве, который будет выше главной диагонали. - C++
Нужно найти минимальный элемент в динамическом массиве который будет выше главной диагонали. Получается что-то не то(( может проблема в...

27
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
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
SlavaSSU
215 / 160 / 45
Регистрация: 17.07.2012
Сообщений: 587
11.07.2014, 14:11 #3
John Prick, неправильно работает. я ввел ему abc 2, ответ aaa, у тебя вывел cbc.
1
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
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
SlavaSSU
215 / 160 / 45
Регистрация: 17.07.2012
Сообщений: 587
11.07.2014, 14:26 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
John Prick, неправильно на тесте bbbb 3(Ответ видимо abba, у тя выводит bbbb)
да и на тесте bbbb 4 утя выводит bbbb хотя должен aaaa
1
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
11.07.2014, 14:36 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
salvator19
1 / 1 / 0
Регистрация: 28.03.2014
Сообщений: 55
11.07.2014, 14:38  [ТС] #7
John Prick, SlavaSSU, Спасибо.
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
11.07.2014, 14:40 #8
salvator19, погоди, посл.вариант нерабочий.
0
salvator19
1 / 1 / 0
Регистрация: 28.03.2014
Сообщений: 55
11.07.2014, 14:41  [ТС] #9
John Prick, уже вижу)
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
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
SlavaSSU
215 / 160 / 45
Регистрация: 17.07.2012
Сообщений: 587
11.07.2014, 14:44 #11
John Prick, ЛОЛ. на тесте bbbb 3 выводит aaaa(т.е. он сделал 4 замены)

ладно щас погоди я попробую написать и тогда ты уже будешь заваливать меня тестами!)
0
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
11.07.2014, 14:45 #12
Теперь, вроде правильно работает.

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

Добавлено через 3 минуты
John Prick, не проходит еще один тест) не хватает чего то еще
0
SlavaSSU
215 / 160 / 45
Регистрация: 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
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
11.07.2014, 14:56 #15
Цитата Сообщение от salvator19 Посмотреть сообщение
не проходит еще один тест
Какой?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2014, 14:56
Привет! Вот еще темы с ответами:

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

Проверьте, можно ли вычеркиванием букв из одного слова получить другое - C++
Нужна помощь,заранее спасибо!!! Проверьте, можно ли вычеркиванием букв из одного слова получить другое.

Имеются слова доноры (из монитор можно получить мотор, рот, тир ) - C++
Имеются слова доноры (из монитор можно получить мотор, рот, тир ). Определить слова, полученных из введенного донора. Подскажите...

В матрице найти минимальный элемент. Получить матрицу порядка n+1 - C++
В заданной действительной квадратной матрице порядка n найти минимальный элемент. Получить матрицу порядка n + 1 путем добавления к каждой...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
11.07.2014, 14:56
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru