Загрузка данных


Задание
Директор одной из школ города N, проанализировав историю браузера на компьютере в классе информатики, был неприятно удивлён тем, какие сайты посещают ученики. Он поручил немедленно установить на всех компьютерах школы фильтр доменов, чтобы заблокировать нежелательные сайты.
Реализовать фильтр доменов поручено вам. Он должен отфильтровать не только сам домен, но и поддомены. Например, если запрещён домен gdz.ru, то должны быть отфильтрованы домены math.gdz.ru, history.gdz.ru, biology.gdz.ru, но не freegdz.ru.
Каждый домен состоит из одного или нескольких непустых слов, записанных латинскими буквами. Слова разделены точками.
Чтобы убедиться, что фильтр качественный, сделайте юнит-тесты.
Что отправлять на проверку
Разработайте класс Domain, задающий домен. Этот класс должен:

    позволять конструирование из объекта string;
    определять operator==;
    иметь метод IsSubdomain, принимающий другой домен и возвращающий true, если this его поддомен.

Разработайте функцию ReadDomains, которая читает из входного файла заданное количество доменов — по одному на строке. Её параметры:

    поток istream, из которого нужно прочитать домены;
    количество доменов.

Разработайте класс DomainChecker со следующими методами:

    Конструктор. Принимает запрещённые домены. Конструктор должен принимать список доменов через пару итераторов.
    Метод bool IsForbidden, принимающий домен и возвращающий true в случае, если он запрещён.

Разработайте юнит-тесты. Их проверит ваш сокурсник.
Функция main уже дана в заготовке. Менять её не нужно.
Ограничения

    Код должен быть качественным, а сигнатуры функций и методов должны соответствовать всем практикам и рекомендациям этого спринта.
    Сложность проверки одного домена — O(L⋅log⁡N)
    O(L⋅logN), где L
    L — максимальная длина домена в символах, а N
    N — количество запрещённых доменов. Перебирать все запрещённые домены при проверке — долго.

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

    В первой строке написано количество запрещённых доменов.
    Далее перечислены запрещённые домены, каждый на отдельной строке.
    На следующей строке указано количество проверяемых доменов.
    Далее перечислены проверяемые домены, каждый на отдельной строке.

Формат выходных данных
Вывод уже содержится в заготовке кода.

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

Пример
Пусть на вход поступил такой текст:

4
gdz.ru
maps.me
m.gdz.ru
com
7
gdz.ru
gdz.com
m.maps.me
alg.m.gdz.ru
maps.com
maps.ru
gdz.ua 

Программа должна вывести:

Bad
Bad
Bad
Bad
Bad
Good
Good 

Как будет тестироваться ваш код
Мы проверим, что:

    Объект Domain можно сконструировать из string.
    Операция == для домена реализована правильно.
    Метод IsSubdomain работает правильно.
    Функция ReadDomains правильно читает список доменов.
    DomainChecker можно сконструировать, передав два итератора на коллекцию доменов.
    Метод IsForbidden класса DomainChecker работает верно.
    Реализация достаточно эффективна.