Найти длину самой длинной строки префикса для всех суффиксов строки.
Например, суффиксами строки ababaa
являются ababaa
, babaa
, abaa
, baa
, aa
и a
. Сходство каждой из этих строк со строкой «ababaa» составляет 6,0,3,0,1,1 соответственно. Таким образом, ответ 6 + 0 + 3 + 0 + 1 + 1 = 11.
Я написал следующий код
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <time.h>
int main ( int argc, char **argv) {
size_t T;
std::cin >> T;
char input[100000];
for ( register size_t i = 0; i < T; ++i) {
std::cin >> input;
double t = clock();
size_t len = strlen(input);
char *left = input;
char *right = input + len - 1;
long long sol = 0;
int end_count = 1;
while ( left < right ) {
if ( *right != '\0') {
if ( *left++ == *right++ ) {
sol++;
continue;
}
}
end_count++;
left = input; // reset the left pointer
right = input + len - end_count; // set right to one left.
}
std::cout << sol + len << std::endl;
printf("time= %.3fs\n", (clock() - t) / (double)(CLOCKS_PER_SEC));
}
}
Работает нормально, но для строки длиной 100000
, имеющей тот же символ, т. Е. aaaaaaaaaa.......a
, требуется много времени, как я могу оптимизировать эту еще одну.