Задача “Поле чудес” С++

120
09 июня 2021, 19:40

Есть задача:

Для игры в «Поле чудес» используется круглый барабан, разделенный на сектора, и стрелка. В каждом секторе записано некоторое число. В различных секторах может быть записано одно и то же число. Однажды ведущий игры решил изменить правила. Он сам стал вращать барабан и называть игроку (который барабана не видел) все числа подряд в том порядке, в котором на них указывала стрелка в процессе вращения барабана. Получилось так, что барабан сделал целое число оборотов, то есть последний сектор совпал с первым. После этого, ведущий задал участнику вопрос: какое наименьшее число секторов может быть на барабане? Требуется написать программу, отвечающую на этот вопрос ведущего.

Входные данные: В первой строке входного файла INPUT.TXT записано число N – количество чисел, которое назвал ведущий (2 ≤ N ≤ 30000). Во второй строке записано N чисел, на которые указывала стрелка в процессе вращения барабана. Первое число всегда совпадает с последним (в конце стрелка указывает на тот же сектор, что и в начале). Числа, записанные в секторах барабана – натуральные, не превышающие 32000.

Выходные данные: В выходной файл OUTPUT.TXT необходимо вывести одно число – минимальное число секторов, которое может быть на барабане.

 Input: 13                                  Output: 6
        5 3 1 3 5 2 5 3 1 3 5 2 5      
 Input: 4                                   Output: 3
        1 2 3 1      
 Input: 7                                   Output: 2
        1 3 1 3 1 3 1        

Я реализовал её, в начале с помощью префикс-функции нахожу подстроки в нём. Потом проверяю, если пред последнее(Так как последнее совпадает с первым) число больше, чем половина, то тогда кол-во чисел меньше половины, а иначе просто n - 1, но задача не проходит 7 тест( Может кто поймёт, где может быть ошибка?
Код:

#include <iostream>
#include <string>
#include <vector>
using namespace std;
int temp, temp1;
vector<int> prefix_function(vector<int> s ) {
    vector<int> pi(s.size(), 0);
    for (int i = 1; i < s.size(); i++) {
        int j = pi[i - 1];  //текущая длина префикса, который мы хотим продолжить
                            //гарантируется, что s[0..j-1] = s[i-j..i-1].
        while (j > 0 && s[i] != s[j]) {     //пока мы не можем продолжить текущий префикс
            j = pi[j - 1];  //уменьшаем его длину до следующей возможной
        }
        //Теперь j - максимальная длина префикса, который мы можем продолжить,
        //или 0, если такового не существует.
        if (s[i] == s[j]) {
            pi[i] = j + 1;
        }
        else {    //такое может произойти только при j = 0
            pi[i] = j;
        }
    }
    return pi;
}
int main() {
    int n;
    cin >> n;
    vector<int> str(n);
    for (int i = 0; i < n; i++) {
        cin >> str[i];
    }
    for (int i = 0; i < n; i++) {
    cout <<prefix_function(str)[i]<<" "; // Это что бы показать, что префикс функция работает правильно
    }

    if (prefix_function(str)[n - 2] < (n  / 2)) {
        cout << n - 1;
    }
        else{ cout << n - prefix_function(str)[n - 2] - 1;
    }
    return 0;
}
Answer 1

Если массив префикс-функции построен, то достаточно проверить, что даёт такое выражение от предпоследнего значения в нём:

k = len - 1 - pi[len - 2] 

Если (len - 1) % k === 0, то k - минимальное число секторов. См. "сжатие строки" здесь

    vector<int> pii = prefix_function(str);
    for (int i = 0; i < n; i++) 
        cout << pii[i] << " "; 
    int k = n - 1 - pii[n - 2];
    int period = ((n - 1) % k == 0) ? k : n - 1;
    cout << std::endl << period;
    return 0;
7
1
2
1
2
1
2
1
0 0 1 2 3 4 5
2
READ ALSO
Помогите с разбором задачи на рекурсию

Помогите с разбором задачи на рекурсию

Между городом A и гоордом B проложена единственная дорога, на которой построено N остановочных пунктовОбычный автобусный маршрут из A в B предусматривает...

106
c++ if в switch с использованием string

c++ if в switch с использованием string

if string обработать может, а switch не можетно использовать if, как-то не красиво

93
Как передать значение datepicker?

Как передать значение datepicker?

Не могу передать значение инпута datepciker, как это можно реализовать? https://cdnjscloudflare

116
Не работает jquery код

Не работает jquery код

Надо чтобы при клике на div с классом "next" ему присваивался класс "next_a", а "next" удалялсяИ соответственно при клике на "next_a" присваивался класс...

110