Форум программистов, компьютерный форум 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, 13:52     Найти лексикографически минимальный палиндром, который можно получить из слова S #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;
}
SlavaSSU
213 / 158 / 44
Регистрация: 17.07.2012
Сообщений: 580
11.07.2014, 14:11     Найти лексикографически минимальный палиндром, который можно получить из слова S #3
John Prick, неправильно работает. я ввел ему abc 2, ответ aaa, у тебя вывел cbc.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
11.07.2014, 14:22     Найти лексикографически минимальный палиндром, который можно получить из слова S #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;
}
SlavaSSU
213 / 158 / 44
Регистрация: 17.07.2012
Сообщений: 580
11.07.2014, 14:26     Найти лексикографически минимальный палиндром, который можно получить из слова S #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
John Prick, неправильно на тесте bbbb 3(Ответ видимо abba, у тя выводит bbbb)
да и на тесте bbbb 4 утя выводит bbbb хотя должен aaaa
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
11.07.2014, 14:36     Найти лексикографически минимальный палиндром, который можно получить из слова S #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;
}
salvator19
 Аватар для salvator19
1 / 1 / 0
Регистрация: 28.03.2014
Сообщений: 50
11.07.2014, 14:38  [ТС]     Найти лексикографически минимальный палиндром, который можно получить из слова S #7
John Prick, SlavaSSU, Спасибо.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
11.07.2014, 14:40     Найти лексикографически минимальный палиндром, который можно получить из слова S #8
salvator19, погоди, посл.вариант нерабочий.
salvator19
 Аватар для salvator19
1 / 1 / 0
Регистрация: 28.03.2014
Сообщений: 50
11.07.2014, 14:41  [ТС]     Найти лексикографически минимальный палиндром, который можно получить из слова S #9
John Prick, уже вижу)
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
11.07.2014, 14:41     Найти лексикографически минимальный палиндром, который можно получить из слова S #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;
}
SlavaSSU
213 / 158 / 44
Регистрация: 17.07.2012
Сообщений: 580
11.07.2014, 14:44     Найти лексикографически минимальный палиндром, который можно получить из слова S #11
John Prick, ЛОЛ. на тесте bbbb 3 выводит aaaa(т.е. он сделал 4 замены)

ладно щас погоди я попробую написать и тогда ты уже будешь заваливать меня тестами!)
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
11.07.2014, 14:45     Найти лексикографически минимальный палиндром, который можно получить из слова S #12
Теперь, вроде правильно работает.

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

Добавлено через 3 минуты
John Prick, не проходит еще один тест) не хватает чего то еще
SlavaSSU
213 / 158 / 44
Регистрация: 17.07.2012
Сообщений: 580
11.07.2014, 14:52     Найти лексикографически минимальный палиндром, который можно получить из слова S #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;
}
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
11.07.2014, 14:56     Найти лексикографически минимальный палиндром, который можно получить из слова S #15
Цитата Сообщение от salvator19 Посмотреть сообщение
не проходит еще один тест
Какой?
salvator19
 Аватар для salvator19
1 / 1 / 0
Регистрация: 28.03.2014
Сообщений: 50
11.07.2014, 14:56  [ТС]     Найти лексикографически минимальный палиндром, который можно получить из слова S #16
SlavaSSU, твой прошел! Спасибо

Добавлено через 29 секунд
John Prick, там дальше не видно тестов. но походу этот bbbb 3
SlavaSSU
213 / 158 / 44
Регистрация: 17.07.2012
Сообщений: 580
11.07.2014, 14:58     Найти лексикографически минимальный палиндром, который можно получить из слова S #17
salvator19, а что за сайт кстати?
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
11.07.2014, 14:58     Найти лексикографически минимальный палиндром, который можно получить из слова S #18
Цитата Сообщение от salvator19 Посмотреть сообщение
там дальше не видно тестов. но походу этот bbbb 3
Выдаёт abba. А какой должен быть ответ?
SlavaSSU
213 / 158 / 44
Регистрация: 17.07.2012
Сообщений: 580
11.07.2014, 15:00     Найти лексикографически минимальный палиндром, который можно получить из слова S #19
John Prick, ответ abba да. Кто вам сказал, что решение падает именно на этом тесте?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2014, 15:01     Найти лексикографически минимальный палиндром, который можно получить из слова S
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
salvator19
 Аватар для salvator19
1 / 1 / 0
Регистрация: 28.03.2014
Сообщений: 50
11.07.2014, 15:01  [ТС]     Найти лексикографически минимальный палиндром, который можно получить из слова S #20
John Prick, вводим bbbb и 3 замены. Он делал 4 замены aaaa
Yandex
Объявления
11.07.2014, 15:01     Найти лексикографически минимальный палиндром, который можно получить из слова S
Ответ Создать тему
Опции темы

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