Название Описание
Дает последовательность А, стремясь сделать последовательность A K в K сегменты (не кратно округлением последнего пункта) до другого числа сегментов. И разворот строки сам же.
мышление
Длина этого вопроса не велика, мы можем перечислить насилие к, подсчитывают количество различных строк для каждого к, а затем обновить ответ. Обратите внимание, что это не говорит строка независимо от того, второго только к его разворот связан, вдвое больше, чем мы имеем дело с положительным и отрицательным значением хэша. Но этот вопрос немного карты одного хэш, желательно с двойной Hash, но я слишком ленив, чтобы писать, мелодию мелодию на б.
код
# include <бит / STDC ++ ч.> с использованием пространства имен STD; ЬурейеЕ неподписанный долго долго Улла; Const лный р = 10000019 ; Const лный MAXN = 2e5 + 10 ; лный sum1 [MAXN], sum2 [MAXN], мощность [MAXN], ANS [MAXN], п, а [MAXN]; лный f_hash (лный л, лный г, BOOL е) { если (е) возвращение sum1 [г] -sum1 [l- 1 ] * Мощность [г-л + 1 ]; остальное возвращение sum2 [л] -sum2 [г + 1 ] * Мощность [г-л + 1 ]; } Установить <лный> с; Улла кал (INT к) { s.clear (); для ( INT I = 1 ; I + k - 1 <= п; г + = к) { лный TMP = мин (f_hash (I, I + k- 1 , 1 ), f_hash (I, I + k - 1 , 0 )); s.insert (TMP); } Вернуть s.size (); } INT основных () { зсапЕ ( " % LLU " , & п); для (лный я = 1 ; г <= п; я ++ ) зсапЕ ( " % LLU ", & [I]); мощность [ 0 ] = 1 ; для (лный я = 1 ; г <= п; я ++ ) { sum1 [I] = sum1 [i - 1 ] * р + а [I]; мощность [I] = мощность [i - 1 ] * р; } Для (лный я = п; я> = 1 ; i-- ) sum2 [I] = sum2 [I + 1 ] * р + а [I]; // для (лный = 1; г <= п; я ++) // Е ( "% LLU% LLU \ п", sum1 [I], sum2 [I]); лный Maxx = 0 , CNT = 0 ; для (лный я = 1 ; г <= п; я ++ ) { Ull теперь = кал (I); если (теперь> Maxx) { Maxx = Теперь; CNT = 0 ; } Если (== Maxx сейчас) ANS [ ++] CNT = я; } Е ( " % LLU% LLU \ п " , Maxx, CNT); для ( INT I = 1 ; г <= CNT; я ++ ) Е ( " % LLU ", ANS [I]); вернуться 0 ; }