Решение задачи с помощью Z-функции

есть у меня тривиальная реализация Z-функции

std::vector<int> z_function (std::string s) {
int n = (int) s.length();
std::vector<int> out (n);
for (int i=1; i<n; ++i)
    while (i + out[i] < n && s[out[i]] == s[i+out[i]])
        ++out[i];
return out;

}

Как с помощью этой функции можно решить эту задачу?

Будем говорить, что символьная строка имеет период k, если она может быть образована путем объединения одной или нескольких одинаковых строк длиной k. Например, строка "abcabcabcabc" имеет период 3, так как она может быть образована путём объединения 4-х строк "abc". Она также имеет период 6 (объединение двух строк "abcabc") и 12 (сама строка "abcabcabcabc").Напишите программу определяющую наименьший период заданной строки.

Вот что у меня получилось но почему-то тесты не проходит

#include <iostream>
#include <vector>
#include <string>

std::vector<int> z_function (std::string s) {
int n = (int) s.length();
std::vector<int> out (n);
for (int i=1; i<n; ++i)
    while (i + out[i] < n && s[out[i]] == s[i+out[i]])
        ++out[i];
return out;
}

int main(){
    int N,counter = 0;
    std::cin >> N;
    std::cin.ignore(1, ' ');
    const int n = 81;
    char *str = new char[n];
    do{
        std::cin.getline(str,n);
        std::vector<int> check = z_function(str);
        int n = check.size();
        for(int i = 0; i < n; i++){
            if(check[i] == n - i && n % i == 0){
                std::cout << i << std::endl;
                break;
            }
        }
        counter++;
        std::cout << std::endl;
    }
    while(counter < N);
    delete[] str;
    return 0;
}

Ответы (1 шт):

Автор решения: MBo

Результат работы функции - целочисленный массив, в котором z[i] — это длина наибольшего общего префикса строки s и её i-го суффикса.

Нужно пройти по z[i], проверяя вот что:

Если z[i]==n-i и n%i==0, то i является длиной периода (наименьшее такое i - длина наименьшего периода)

→ Ссылка