Регистрация
8 Сен 2013
Сообщения
85
Репутация
1
Спасибо
0
Монет
0
У Егора есть хобби – он любит делать слова в произвольных текстах грязными. Чтобы сделать из некоторого слова грязное, надо оставить на своих местах первую и последнюю буквы, а затем перемешать все остальные буквы, слово при этом должно измениться. Если же сделать слово грязным не получается (как ни перемешивай – слово не меняется), то его оставляют нетронутым.

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

Формат входных данных

На вход подается текст, состоящий из маленьких и больших латинских букв, знаков «!?:;-.,» и пробелов. Словом называется последовательность подряд идущих маленьких и больших латинских букв, которую нельзя расширить влево или вправо.

Формат выходных данных

Выведите преобразованный текст, в котором как можно больше слов превращены в грязные.

Вывод должен кончаться переносом строки.

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

Примеры

Входные данные

I want--to!!!!break??Free

Выходные данные

I wnat--to!!!!berak??Fere

Входные данные

Cat is not bread

Выходные данные

Cat is not berad
 
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main() {
string s;
getline(cin, s);

int n = s.length();

for (int i = 0; i < n; i++) {
int j;
for (j = i; (j < n) && (isalpha(s[j])); j++) {}
if (j - i >= 3) {
reverse(s.begin() + i + 1, s.begin() + j - 1);
}
i = j - 1;
}

cout << s;

return 0;
}
 
#include
#include
#include
using namespace std;

int main()
{
string str, result, buff;
getline(cin, str);
str += '\n';
for (auto& i : str)
{
if (!isalpha(i))
{
if (buff.size())
{
if (buff.size()>3) next_permutation(buff.begin() + 1, buff.end() - 1);
result += buff;
buff.clear();
}
result += i;
}
else buff += i;
}
cout
 
#include
#include
#include
#include
using namespace std;
vector split(const string& line) {
vector tokens;
string word;
string noword;
const size_t length = line.length();
for (size_t i = 0; i < length; ++i) {
if (isalpha(line)) {
if (noword.length()) {
tokens.push_back(noword);
noword.clear();
}
word += line;
} else {
if (word.length()) {
tokens.push_back(word);
word.clear();
}
noword += line;
}
if (i + 1 == length) tokens.push_back(word + noword);
}
return tokens;
}
void smear(string& line) {
auto length = line.length();
if (length < 4) return;
auto last = length - 1;;
if (length & 1) {
--last;
swap(line[1], line[last]);
}
for (size_t i = 1, j = 2; j < last; i += 2, j += 2) {
swap(line, line[j]);
}
}
string mixed(const string& line) {
string res;
auto box = split(line);
for (auto& x : box) {
if (isalpha(x.front())) smear(x);
res += x;
}
return res;
}
int main() {
string line;
getline(cin, line);
line = mixed(line);
cout
 
Вариант без выделения массива под слова.
1) Находим начало слова.
2) Находим конец слова.
3) Идем по средним буквам слова. Если две соседние буквы разные - меняем их местами и переходим к концу слова.
4) Переходим на шаг 1.
 
Назад
Сверху