Задача была взята с сайта 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; }