переменный ток автомат обязательно запрос, установленные дерева на указателе прыжка --cf963D

Решение выглядело страшно, на самом деле, для того, чтобы оптимизировать переменную автоматный указатель насилия прыжка потерпеть неудачу. ,

В дополнение к сложности этого анализа проблемы очень стоит обучение

/ *
Учитывая письмо строка 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 главы



* /

 

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

отwww.cnblogs.com/zsben991126/p/11701240.html
рекомендация