Большое спасибо, за статьи и за ответ.
Попробую это обдумать.
А если ребер нет, то и не проверять. То есть можно флаг "проверено" сделать для узла, и не заходить 2-й раз. Не усложняю?
1 2012-06-28 16:57:46
Re: Наибольшая общая подстрока трех строк (15 ответов, оставленных в Problems)
2 2012-06-28 16:36:30
Re: Наибольшая общая подстрока трех строк (15 ответов, оставленных в Problems)
Но ведь в таком случае я , возможно, буду в каждое состояние заглядывать не 1 раз, а это может замедлить программу. Разве не так? Или полученный суффиксный автомат нужно было как-то преобразовать?
3 2012-06-28 16:15:55
Re: Наибольшая общая подстрока трех строк (15 ответов, оставленных в Problems)
Логику я понимаю. И деление, обход, все понятно.
Не ясно, как, делая обход по суффиксным обратным ссылкам в глубину, определить наличие пути по символу из узла.
Вот лог обхода с номером состояния, строкой и ссылками перехода.
2 строки: aba, zab, разделители - цифры.
v: 0
longest:
1 2 4 5 8
v: 1
longest: a
3 6
v: 3
longest: aba
v: 6
longest: aba0za
v: 2
longest: ab
7
v: 7
longest: aba0zab
v: 4
longest: aba0
v: 5
longest: aba0z
v: 8
longest: aba0zab1
Как двигаясь по этим ссылкам, определить наличие пути? Или я не так что-то сделал?
Я уже от корки до корки перечитал статьи - про автомат со всеми задачами, найти наибольшую повторяющуюся подстроку оказалось несложно, с двумя тоже все легко. Но я застопорился на том, как определить путь из узла проходом в глубину, двигаясь по суффиксным ссылкам (обратным).
4 2012-06-28 15:50:15
Re: Наибольшая общая подстрока трех строк (15 ответов, оставленных в Problems)
Здравствуйте.
Та же задача.
Сделал суффиксный автомат, и общая подстрока ищется при проходе по буквам, но это медленный метод.
Пробую организовать проход по инвертированным суффиксным ссылкам, чтобы обойтись за время O(n). Но в таком случае я не понимаю, как проверить, находясь в каком-либо узле, есть ли у него путь, содержащий разделитель.
Я уже кучу версий перепробывал. Или это нужно как-то учесть при построении автомата? Или нужно автомат превратить в дерево?
Не могу понять, как проверить путь, если двигаться не по буквенным ссылкам автомата, которые этот путь и определяют.