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

Задача была взята с сайта 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;
}
Перейти к верхней панели