Решение выглядело страшно, на самом деле, для того, чтобы оптимизировать переменную автоматный указатель насилия прыжка потерпеть неудачу. ,
В дополнение к сложности этого анализа проблемы очень стоит обучение
/ * Учитывая письмо строка s, дать Допрос заданную п (к, т) Для каждого запроса, значение минимальной длины т в т е является подстроку, и т появляется в виде подстроки т раз т Создание нескольких строк переменного тока автомат, то S совпадают, вектор появление позиции со всех запросов сохраняются Затем попросите каждый из соответствующих K обновленных ответов Для обеспечения Сложности: вскочить прыжок насилие не подведет, указатель должен быть использован непосредственно на предварительно точку опроса с прыжком Таким образом, каждый прыжок вверх пусть запрос в векторе обновляя новое значение Поскольку SQRT (п) различной максимальной длины строки запроса, в с [I], чтобы быть в конце строки, соответствующей только SQRT (п) число, То есть на провал в дерево прыжок nsqrt (п) раз * / #Include <бит / STDC ++ ч.> С использованием пространства имен STD; #define N 200005 структура запросов { вектор < INT > позиция; ИНТ к, Len; } Q [N]; Чара S [N], ЬиЕ [N]; ИНТ п; структура Trie { INT NXT [N] , [ 26 ], не в [Н], идентификатор [N], предварительно [N]; INT корень, л; ИНТ newnode () { MemSet (NXT [L], - 1 , SizeOf NXT [L]); Идентификатор [L] = 0 ; вернуться L ++ ; } недействительными инициализации () {L = 0 ; корень = newnode ();} недействительным вставка ( символ BUF [], INT ID) { INT Len = StrLen (BUF); Int теперь = корень; для ( INT I = 0 ; я <длина; я ++ ) { если (NXT [теперь] [ЬиЕ [I] - ' ' ] == - 1 ) NXT [теперь] [ЬиЕ [I] - ' ' ] = newnode (); Теперь = NXT [теперь] [ЬиЕ [I] - ' ' ]; } Идентификатор [теперь] = ID; } недействительные сборки () { Очередь < INT > д; не в состоянии [корень] = корень; для ( INT I = 0 ; г < 26 ; я ++ ) , если (NXT [корень] [I] == - 1 ) NXT [корень] [I] = корень; еще { неудача [NXT [корень] [I]] = корень; q.push (NXT [корень] [I]); } предварительно [корень] = 0 ; это время (q.size ()) { INT Теперь = q.front (); q.pop (); // В этот момент теперь неудачу была создана IF (указанное выше идентификатор [обязательно [теперь]]! = 0 ) // найти запрос местоположение предварительно [теперь] = Сбой [теперь]; остальное предварительно [теперь] = предварительно [Сбой [теперь]]; для ( INT I = 0 ; г < 26 ; я ++ ) , если (NXT [теперь] [я] == - 1 ) NXT [теперь] [I] = NXT [неудачу [теперь]] [I]; еще { неудача [NXT [теперь] [я]] = NXT [неудача [теперь]] [I]; q.push (NXT [теперь] [I]); } } } недействительный запрос ( символ * s) { INT Len = StrLen (ы); Int теперь = корень; для ( INT I = 0 ; я <длина; я ++ ) { Теперь = NXT [теперь] [с [я] - ' ' ]; // 通过предварительно向上跳ИНТ р = Теперь; в то время как (р) { . Д [ID [р]] pos.push_back (я); р = предварительно [р]; } } } } Переменного тока; Int основных () { ac.init (); зсапЕ ( " % s " , s); CIN >> п; для ( INT I = 1 ; г <= п; я ++ ) { зсапЕ ( " % d% s " , & д [I] .k, ЬиЕ); Q [I] .LEN = StrLen (BUF); ac.insert (BUF, я); } ac.build (); ac.query (ы); // для (INT I = 1; я <= ac.L; я ++) // соиЬ << ac.pre [я] <<»«; // обработка каждого допроса для ( INT I = 1. , I <= п; I ++ ) { // COUT << Q [I] .pos.size () << "\ п"; ЕСЛИ (Q [I]. pos.size () < Q [I] .К) { ставит ( " -1 " ); продолжить ; } INT анс = 0x3f3f3f3f ; для ( INT J = Q [I] .k- 1 ; J <д [I] .pos.size (); j ++ ) { ANS = мин (ANS, Q [I] .pos [J] -q [I] .pos [JQ [I] .k + 1 ] + д [I] .LEN); } COUT << анс << ' \ п ' ; } } / * aaabbbbaaabababab 27 2 aaabbbbaaaba 2 baaabab 1 abbbbaaabab 1 aabbbbaaabab 6 1 aaabbbbaaabababab 2 AABA 2 abbbba 5 аа 2 aaabbbb 2 abababa 3 аба 2 baaa 2 bbaaababa 1 aaabab 1 abbb 1 bbbbaaabababa 1 baaab 1 abbbbaaabababa 1 aaababa 1 ABABAB 2 рис 2 baaabababa 1 bbaaabababa 2 Aaabb 1 АВАВ АВАВ 4 главы * /