Жемчужное ожерелье бусы

https://loj.ac/problem/2427

Название Описание

  Дает последовательность А, стремясь сделать последовательность 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 ; 
}

 

рекомендация

отwww.cnblogs.com/fangbozhen/p/11620768.html