Редакция для Чистка дампа


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

1. Идея

Нужно построить новую строку, проходя по исходной посимвольно.

Для каждого символа есть ровно три варианта:

  • если это пробел, заменяем его на _;
  • если это латинская буква, цифра или уже символ _, оставляем его;
  • иначе это мусор, и такой символ просто пропускаем.

То есть задача сводится к обычной фильтрации строки по простым правилам.

2. Наблюдения

  1. Строку удобно обрабатывать слева направо, по одному символу.
  2. Никаких сложных преобразований нет: решение зависит только от текущего символа.
  3. Важно читать всю строку целиком, включая пробелы. Поэтому:
    • в C++ нужно использовать getline(cin, s);
    • в Python достаточно input(), так как вход состоит из одной строки.
  4. Если все символы окажутся мусором, результатом будет пустая строка. Это нормально: нужно просто вывести пустую строку.

3. Алгоритм

  1. Считать всю строку s.
  2. Создать пустую строку результата.
  3. Для каждого символа c в s:
    • если c == ' ', добавить в результат _;
    • иначе если c — одна из латинских букв a-z, A-Z, цифра 0-9 или _, добавить c в результат;
    • иначе ничего не делать.
  4. Вывести результат.

4. Почему это работает

Докажем, что алгоритм строит именно ту строку, которая требуется по условию.

Рассмотрим любой символ исходной строки:

  • Если это пробел, по условию его нужно заменить на _. Алгоритм делает ровно это.
  • Если это допустимый символ — латинская буква, цифра или _, по условию он не считается мусором и должен остаться в строке. Алгоритм добавляет его в результат без изменений.
  • Если это любой другой печатный ASCII-символ, он считается мусором и должен быть удалён. Алгоритм его не добавляет.

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

5. Сложность

Пусть длина строки равна n.

  • Время работы: O(n), потому что каждый символ обрабатывается один раз.
  • Память: O(n), потому что нужно хранить результирующую строку.

6. Код на C++17

#include <iostream>
#include <string>
#include <vector>
using namespace std;

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

    string result;
    result.reserve(s.size());

    for (char c : s) {
        if (c == ' ') {
            result.push_back('_');
        } else if ((c >= 'a' && c <= 'z') ||
                   (c >= 'A' && c <= 'Z') ||
                   (c >= '0' && c <= '9') ||
                   c == '_') {
            result.push_back(c);
        }
    }

    cout << result;
    return 0;
}

7. Код на Python 3

s = input()

res = []

for c in s:
    if c == ' ':
        res.append('_')
    elif ('a' <= c <= 'z') or ('A' <= c <= 'Z') or ('0' <= c <= '9') or c == '_':
        res.append(c)

print(''.join(res))

Комментарии

Еще нет ни одного комментария.