Они генерировали и хранили подмножества для отслеживания количества пар коров с одним общим ароматом, двумя общими ароматами, тремя общими, четырьмя общими и всеми пятью общими. Для этого они использовали карту.
Теперь есть 31N подмножеств, потому что для каждой коровы вы можете создать 31 комбинацию любимых ароматов. Например, любимые ароматы мороженого Cow 1 были 1, 2, 3, 4, 5. Таким образом, различные подмножества были:
{1, 0, 0, 0, 0} {1, 3, 0, 0, 0} {2, 5, 0, 0, 0} {1, 2, 5, 0, 0}
{1, 2, 0, 0, 0} {1, 4, 0, 0, 0} {1, 3, 4, 0, 0} {2, 3, 5, 0, 0}
{1, 2, 3, 0, 0} {1, 5, 0, 0, 0} {1, 3, 5, 0, 0} {3, 4, 5, 0, 0}
{1, 2, 3, 4, 0} {2, 3, 0, 0, 0} {2, 3, 4, 0, 0} {1, 2, 3, 5, 0}
{1, 2, 3, 4, 5} {2, 4, 0, 0, 0} {2, 4, 5, 0, 0} {1, 3, 4, 5, 0}
{2, 3, 4, 5, 0} {2, 0, 0, 0, 0} {3, 0, 0, 0, 0} {4, 0, 0, 0, 0}
{5, 0, 0, 0, 0} {3, 4, 0, 0, 0} {3, 5, 0, 0, 0} {4, 5, 0, 0, 0}
{1, 4, 5, 0, 0} {1, 2, 4, 0, 0} {1, 2, 4, 5, 0}
Как вы можете видеть, существует 31 подмножество. (Это потому, что можно сделать 2 ^ 5 = 32 набора, включая пустой набор. 32 - 1 = 31.) Поскольку N ≤ 50 000, вы можете сгенерировать 31N подмножеств. После сканирования входных данных код сгенерировал подмножества для каждой коровы и добавил их на карту:
map<S5, int> subsets;
Они сопоставили каждую комбинацию с количеством раз, которое она была замечена. Вот некоторые примеры записей для входных данных:
{
[{1, 0, 0, 0, 0}, 2], # 2 cows, Cow 1 and Cow 2 both like flavor 1
[{8, 10, 0, 0, 0}, 2], # 2 cows, Cow 2 and Cow 3 both like flavors 8 and 10
[{50, 60, 80, 0, 0}, 1], # 1 cow, Cow 4 liked flavors 50, 60, 80
# and so on...
}
Наконец, основываясь на количестве ненулевых чисел в подмножестве, алгоритм применяет принцип включения-исключения. Он просто перебирает все 31N подмножеств и либо добавляет, либо вычитает количество, сохраненное в карте для этого подмножества. (Если это были 1, 3 или 5 ненулевых чисел, подсчеты были добавлены; иначе они были вычтены.) Затем он вычитает этот ответ из N * (N-1) / 2, чтобы вывести количество пар коров, которые не являются совместимо.
Надеюсь, это объяснение поможет! Удачи в будущих конкурсах!