Тут надо построить конечный автомат, который принимает строки, которые кончаются на заданную строку. Посмотрите эту
статью, там в начале расписан этот автомат (секции перфикс функция - атомат КМП).
Только там все вероятности перехода одинаковые, у вас же они заданы для каждой буквы.
Вот построили вы автомат. Теперь задача состоит в том, чтобы найти вероятность, что случайный путь в этом автомате длины n пройдет через конечное состояние ровно один раз. Для этого подсчитайте 2 вероятности: что путь из начала длины k дойдет до конечного состояния один раз, и что путь из конечного состояния длины n-k не вернется в него.
Обе эти вероятности можно подсчитать динамическим программированием:
P1(i, k) - вероятность того, что путь начиная с состояния i (i < n) за k шагов дойдет до состояния n первый раз. Это просто сумма по всем возможным переходам:
P1(i, k) = sum_{c - все символы} P1(next(i, c), k-1) * p(c)
База:
P1(m, 0) = 1
P1(m, k>0) = 0
P1(i < m, 0) = 0
Вторая вероятность: сделать k шаговиз состояния i и ни разу не войти в конечное состояние:
P2(i, k) = sum_{c - все символы, next(i,c) < m} P2(next(i, c), k-1) * p(c)
База:
P1(i, 0) = 1
Ответ к задаче - сумма по всем возможным длинам первой части пути:
sum_{k=m..n} P1(0, k) * P2(m, n-k)
Это решение через динамическое программирование будет O(n*m) по вермени и по памяти.
Замкнутой формулы, как в задаче в моей статье я тут не вижу. Может, если бы вероятности всех символов были бы одинаковы, то что-то можно было бы сократить.