Правила построения хорошего слова подразумевают, что каждое хорошее слово начинается с «а» и заканчивается «б».Следовательно, существует уникальное (вплоть до упорядочения - правило 3) разложение красивого слова на красивые подслов: найти все «ab», а затем попытаться расширить их, используя правило 2, и упорядочить их, используя правило 3. Мыможет выразить это разложение через дерево (n ветвей для повторного применения правила 3).
В контексте дерева отношение "~" просто выражает изоморфные деревья, я думаю (где порядок ветвления не имеет значения).
РЕДАКТИРОВАТЬ : как указано, порядок ветвления имеет значение.
Я попытаюсь решить проблему, как указано в исходной ссылке(2 определения «nice» не совпадают).
Во-первых, сходство между двумя словами X и Y с использованием DP.
Определите f(a, b, n)
как функциюэто означает, что X[a..a+2n-1]
похоже на Y[b..b+2n-1]
и что оба подслова хороши.
f(a, b, 0) = 1.
для n> 0,
f(a, b, n) = f1(a, b, n) or f2(a, b, n) or f3(a, b, n)
f1(a, b, n) = x[a] == y[b] == 'a' and x[a+2n-1] == y[b+2n-1] == 'b' and f(a+1, b+1, n-1)
f2(a, b, n) = any(1 <= k < n) f(a, b, k) and f(a+2k, b+2k, n-k)
f3(a, b, n) = any(1 <= k < n) f(a, b+2(n-k), k) and f(a+2k, b, n-k)
Я думаю, что это O (n ^4) (Ург).
Для второй части, если вы представляете слова в виде графа с представлением реберЧто касается отношения сходства, я думаю, вы пытаетесь найти максимально независимый набор.Если это так, удачи!В общем случае это NP-сложный (то есть, нет лучшего решения, чем пробовать все комбинации), и я не вижу каких-либо свойств, облегчающих это: (
EDITED Чтобы определить сходство автоматически, проверьте правильность. Это довольно легко.
EDITED еще раз из-за моей глупости.