Решение задачи "Email-адрес"

2 минут

Задача была взята с сайта codeforces.ru (турнир (Codeforces Beta Round #40 (Div. 2), задача C), ниже приведено полное решение этой задачи.

Условие🔗︎

Иногда email-адреса приходится диктовать по телефону. Точку обычно называют словом dot, а собаку at. В результате получается что-то вроде vasyaatgmaildotcom. Ваша задача — преобразовать это в корректный email-адрес (vasya@gmail.com).

Известно, что корректный email-адрес содержит только символы . @ и маленькие латинские буквы, не начинается и не заканчивается точкой. Также, корректный email-адрес не начинается и не заканчивается собакой. Более того, email-адрес содержит ровно один символ @ но при этом может содержать любое (возможно, нулевое) количество точек.

Требуется произвести серию замен, чтобы длина результата оказалась как можно меньше, и он являлся корректным email-адресом. При равенстве длин нужно вывести лексикографически минимальный результат.

Всего возможно два варианта замены: dot можно заменить на точку, at можно заменить на собаку.

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

В первой строке содержится описание email-адреса. Гарантируется, что это — корректный email-адрес, в котором все точки заменены на dot и собака заменена на at. Строка не пуста, и ее длина не превосходит 100 символов.

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

Выведите кратчайший email-адрес, из которого могла быть получена указанная строка путем указанных выше замен. Если решений несколько, выведите лексикографически минимальное (лексикографическое сравнение строк реализует оператор < в современных языках программирования).

Символы идут в таблице ASCII в следующем порядке: . @ ab...z

Решение на C++🔗︎

#include <iostream>

int main()
{
    std::string str, result;
    getline(std::cin, str);

    unsigned int pos;

    // replace at
    pos = str.find("at", 1);
    if (pos != std::string::npos) {
        str.replace(pos, 2, "@");
    }

    // replace dot
    pos = str.find("dot", 1);
    while ( (pos != std::string::npos) && (pos != str.size() - 3) ) {
        str.replace(pos, 3, ".");
        pos = str.find("dot", 1);
    }

    std::cout << str << std::endl;
    return 0;
}