Имея два отсортированных вектора a
и b
, найдите все векторы, которые являются суммами a
и некоторой перестановки b
и которые уникальны после сортировки.
Создать один из искомых векторов можно следующим образом:
- Возьмите вектор
a
и перестановку вектораb
. - Сложите их так, чтобы получилось
c[i]=a[i]+b[i]
. - Сортировать
c
.
Мне интересно найти набор b
-перестановок, которые дают полный набор уникальных c
векторов.
Пример 0: a='ccdd'
и b='xxyy'
Дает суммированные векторы: 'cycydxdx'
, 'cxcxdydy'
, 'cxcydxdy'
.
Обратите внимание, что перестановки b
: 'xyxy'
и 'yxyx'
равны, потому что в обоих случаях "поле c" и "коробка d" получают ровно одно 'x'
и одно 'y'
.
Я предполагаю, что это похоже на размещение M
шаров в M
ящиках (по одному в каждом), при этом некоторые группы шаров и ящиков идентичны.
Обновление: Учитывая строку a='aabbbcdddd'
и b='xxyyzzttqq'
, ваша задача будет 10 мячи в 4 коробках. Есть 4 различных ящика размера 2, 3, 1 и 4. Шары попарно неразличимы.
Пример 1. Даны строки a='xyy'
и b='kkd'
.
Возможное решение: 'kkd'
, 'dkk'
.
Причина: Мы видим, что все уникальные перестановки b
равны 'kkd'
, 'kdk'
и 'dkk'
. Однако с нашими ограничениями две первые перестановки считаются равными, так как индексы, в которых различия сопоставляются с одним и тем же символом 'y'
в строке a
.
Пример 2. Даны строки a='xyy'
и b='khd'
.
Возможное решение: 'khd'
, 'dkh'
, 'hkd'
.
Пример 3. Даны строки a='xxxx'
и b='khhd'
.
Возможное решение: 'khhd'
.
Я могу решить проблему создания уникальных кандидатов b
перестановок, используя алгоритм Нараяны Пандиты, как описано в Wikipedia/Permutation.
Вторая часть кажется сложнее. Мой лучший способ — попарно соединить две строки в списке, отсортировать его и использовать в качестве ключа в наборе поиска. ('xx'
+'hd'
соединение→'xh','xd'
сортировка→'xd','xh'
).
Поскольку мои M
часто бывают очень большими, а сходство в строках является обычным явлением, в настоящее время я генерирую гораздо больше b
перестановок, чем на самом деле проходит через заданный фильтр. Я хотел бы иметь алгоритм, генерирующий правильные напрямую. Любое улучшение приветствуется.
i=1
иj=2
иa[i]=a[j]
. Таким образом, перестановки, которые отличаются толькоi
изj
, равны. - person Thomas Ahle   schedule 20.06.2010