Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ///////////////////////////////////////////////////////////////////
- //1.
- ///////////////////////////////////////////////////////////////////////////////
- //Даны три строки, состоящие из строчных латинских букв. С этими строками можно
- //производить следующие операции: либо заменить один символ строки на два таких же символа
- //(например, заменить символ «a» на «aa»), либо, наоборот, заменить два подряд идущих
- //одинаковых символа на один такой же символ.
- //Необходимо при помощи этих операций сделать все три строки равными какой-то другой
- //общей строке S либо определить, что это сделать невозможно. При этом нужно минимизировать
- //общее количество операций.
- //Программа получает на вход три строки, состоящие из строчных букв латинского алфавита.
- //Длина каждой строки не превышает 100 символов.
- //Если при помощи указанных операций возможно сделать все три строки равными, выведите
- //такую строку S, что суммарное число операций, необходимых для преобразования всех трёх
- //данных строк к строке S, будет минимальным. Если этого сделать нельзя, программа должна
- //вывести одно слово IMPOSSIBLE (заглавными буквами).
- //Примеры:
- //Ввод:
- //aaaza
- //aazzaa
- //azzza
- //Вывод:
- //aazza
- //Ввод:
- //xy
- //xxyy
- //yx
- //Вывод:
- //IMPOSSIBLE
- ///////////////////////////////////////////////////////////////////////////////
- #include <algorithm>
- #include <cmath>
- #include <iostream>
- #include <iterator>
- #include <set>
- #include <string>
- #include <vector>
- ///////////////////////////////////////////////////////////////////////////////
- typedef std::string T_str;
- typedef std::vector < T_str > T_strings;
- typedef std::multiset < int > T_sizes;
- ///////////////////////////////////////////////////////////////////////////////
- class T_super_letter
- {
- //-------------------------------------------------------------------------
- char letter_;
- T_sizes sizes_;
- //-------------------------------------------------------------------------
- public:
- //-------------------------------------------------------------------------
- T_super_letter
- (
- char letter,
- int size
- )
- :
- letter_( letter )
- {
- sizes_.emplace( size );
- }
- //-------------------------------------------------------------------------
- bool operator== ( T_super_letter const & R ) const
- {
- return letter_
- == R.letter_;
- }
- //-------------------------------------------------------------------------
- T_super_letter & operator+= ( T_super_letter const & R )
- {
- sizes_.insert (
- R.sizes_ .begin (),
- R.sizes_ .end ()
- );
- return *this;
- }
- //-------------------------------------------------------------------------
- T_str to_string() const
- {
- auto it = sizes_.begin();
- std::advance (
- it,
- sizes_.size() / 2
- );
- return T_str (
- *it,
- letter_
- );
- }
- //-------------------------------------------------------------------------
- };
- ///////////////////////////////////////////////////////////////////////////////
- typedef std::vector < T_super_letter > T_super_letters;
- ///////////////////////////////////////////////////////////////////////////////
- class T_super_word
- {
- //-------------------------------------------------------------------------
- bool is_valid_;
- T_super_letters super_letters_;
- //-------------------------------------------------------------------------
- public:
- //-------------------------------------------------------------------------
- T_super_word (
- T_str const & s = {}
- )
- :
- is_valid_( true )
- {
- auto it = s.begin();
- auto it_next = s.begin();
- while (
- (
- it_next = find_if
- (
- it,
- s.end(),
- [=] ( auto elem )
- {
- return elem != *it;
- }
- )
- )
- != it
- )
- {
- super_letters_.emplace_back (
- T_super_letter (
- *it,
- it_next - it
- )
- );
- std::swap( it, it_next );
- }//for
- }
- //-------------------------------------------------------------------------
- T_super_word & operator+= ( T_super_word const & R )
- {
- if (
- super_letters_.empty()
- )
- {
- *this = R;
- }
- else
- {
- is_valid_ = is_valid_
- && super_letters_
- == R.super_letters_;
- if( is_valid_ )
- {
- auto it = super_letters_.begin();
- for( auto const & sup_lett : R.super_letters_ )
- {
- *it += sup_lett;
- ++it;
- }
- }//if
- }//else
- return *this;
- }
- //-------------------------------------------------------------------------
- T_str to_string() const
- {
- T_str res;
- if( is_valid_ )
- {
- for( auto const & sup_lett : super_letters_ )
- {
- res += sup_lett.to_string();
- }
- }
- else
- {
- res = "IMPOSSIBLE";
- }
- return res;
- }
- //-------------------------------------------------------------------------
- };
- ///////////////////////////////////////////////////////////////////////////////
- T_str best_overall_line( T_strings const & strings )
- {
- T_super_word res;
- for( auto const & s : strings )
- {
- res += T_super_word(s);
- }
- return res.to_string();
- }
- ///////////////////////////////////////////////////////////////////////////////
- int main()
- {
- T_strings strings(3);
- for( auto & s : strings )
- {
- std::cin >> s;
- }
- std::cout << std::endl
- << best_overall_line( strings )
- << std::endl;
- }
- 1
- Tenday
- 0 / 0 / 0
- Регистрация: 19.10.2015
- Сообщений: 16
- 21.10.2016, 14:28 [ТС] 5
- Интересный стиль. Многие приемы и функции в Вашем коде для меня пока еще неизвестны, но думаю будет полезно разобраться в нем. Только у меня не компилируется в 97 строке, пишет "it does not name a type"
- 0
- Mr.X
- Эксперт С++
- 3193 / 1720 / 435
- Регистрация: 03.05.2010
- Сообщений: 3,867
- 21.10.2016, 15:26 6
- Цитата Сообщение от Tenday Посмотреть сообщение
- Только у меня не компилируется в 97 строке, пишет "it does not name a type"
- Не знаю, у меня нормально компилируется. А С++11 подключили?
- 0
- 21.10.2016, 15:26
- Answers
- Эксперт
- 37091 / 29110 / 5898
- Регистрация: 17.06.2006
- Сообщений: 43,301
- 21.10.2016, 15:26
- Вывести ряд чисел, кратных либо 2, либо 3, либо 5
- Ребят погоди решить такую задачу, а то что-то то что делаю выдаёт не то. Ряд может быть до 1500...
- Разбить входную строку на массив слов, содержащих либо только цифры, либо только буквы
- Доброго времени суток. Необходимо разбить входную строку на массив слов, содержащих либо только...
- Как разделить чек на то чтобы отображалось либо товар либо услуга
- Ребята,помогите пожалуйста ,реально я уже незню что делать Вообщем бд в аксесе,там у меня через...
- Искать еще темы с ответами
- Или воспользуйтесь поиском по форуму:
- 6
- Ответ Создать тему
- КиберФорум - форум программистов, компьютерный форум, программирование
- Реклама - Обратная связь
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement