Есть задача:
Для игры в «Поле чудес» используется круглый барабан, разделенный на сектора, и стрелка. В каждом секторе записано некоторое число. В различных секторах может быть записано одно и то же число. Однажды ведущий игры решил изменить правила. Он сам стал вращать барабан и называть игроку (который барабана не видел) все числа подряд в том порядке, в котором на них указывала стрелка в процессе вращения барабана. Получилось так, что барабан сделал целое число оборотов, то есть последний сектор совпал с первым. После этого, ведущий задал участнику вопрос: какое наименьшее число секторов может быть на барабане? Требуется написать программу, отвечающую на этот вопрос ведущего.
Входные данные: В первой строке входного файла 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;
}
Если массив префикс-функции построен, то достаточно проверить, что даёт такое выражение от предпоследнего значения в нём:
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
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Между городом A и гоордом B проложена единственная дорога, на которой построено N остановочных пунктовОбычный автобусный маршрут из A в B предусматривает...
if string обработать может, а switch не можетно использовать if, как-то не красиво
Не могу передать значение инпута datepciker, как это можно реализовать? https://cdnjscloudflare
Надо чтобы при клике на div с классом "next" ему присваивался класс "next_a", а "next" удалялсяИ соответственно при клике на "next_a" присваивался класс...