Мне действительно нравится эта вещь, называемая z-алгоритмом: http://www.utdallas.edu/~besp/demo/John2010/z-algorithm.htm
Для каждой позиции вычисляется самая длинная подстрока, начиная с нее, которая также является префиксом всей строки. (в линейном времени, конечно).
a a b c a a b x a a a z
1 0 0 3 1 0 0 2 2 1 0
Учитывая эту "z-таблицу", легко найти все строки, которые могут быть возведены в целое. Просто проверьте все позиции, если pos+z[pos] = n
.
В нашем случае:
a b a b
0 2 0
Здесь pos = 2
дает вам 2+z[2] = 4 = n
, следовательно, самая короткая строка, которую вы можете использовать, имеет длину 2.
Это даже позволит вам найти случаи, когда совпадает только префикс из возведенной в степень строки, например:
a b c a
0 0 1
Здесь (abc)^2
можно сократить до вашей исходной строки. Но, конечно, если вам не нужны такие совпадения, просто перейдите через делители.