Длина строки 10 ^ 5 предполагает, что квадратичное c решение слишком медленное. Вы генерируете все n ^ 2 подстрок, а также вычисляете их хэши, поэтому общее время равно cubi c и ожидаемое время ожидания.
Вместо этого вы можете построить массив суффиксов за O (nlogn), а затем построить LCP (самый длинный общий префикс) с помощью метода Kasai или другого al go.
Мы можем видеть, что каждый суффикс p[i]
имеет длину n - p[i]
и создает n - p[i]
префиксов в качестве подстрок. Но lcp[i-1]
префиксы совпадают с префиксами предыдущего суффикса! Таким образом, у нас есть только n - p[i] - lcp[i-1]
новых подстрок inique для каждого суффикса. Go через siffixes и получить количество различных подстрок в O (n) времени.
Общее время
O(nlogn) (suffix array) +
O(n) (Kasai LCP) +
O(n) for counting =
O(nlogn)