Помощник написания кода на С++

8. Алгоритм Ахо-Корасика

На примере ababb
Нам потребуются состояния всех префиксов (пустое, a, ab, aba, abab, ababb (конечное) ), расставим "очевидные" стрелки (из пустого по 'a'  в "a", из "a" по 'b' в "ab" и тд.)
Основная идея - суффикс-ссылки. Суффикс-ссылка должна вести в самый длинный нетривиальный суффикс, то есть
"a"       -> пустое,
"ab"     -> пустое,
"aba"   -> "a",
"abab" -> "ab".
Тогда имеет место следующая конструкция:
"строка-родитель" -буква-> "строка-дочь"
 суффикс-|-ссылка               суффикс-|-ссылка 
"строка-род-суф"   -буква-> "строка-суф-дочь"
Поэтому для пустой строки и первой буквы можем легко сделать переходы, а дальше сделать рекуррентно (то есть через предыдущие) : найти суффикс-ссылку, пройдя по нужной букве суффикс-ссылки родителя, и остальные буквы получить через суффикс ссылку.
Так мы получаем, что из состояния "abab" по букве 'а' нужно попасть в "aba", т.к. туда ведёт суффикс ссылка "ab" по букве 'а'