(挿入の逆の順序で、すなわち、文字列接尾辞木を確立親木)、その後に合わせて見つけることができDFS 直接、その後満たす昇順に辞書式順序を遊ん配置、あなたはサブツリーすべての瞬間の文字列の長さと順序を維持することができ、かつDFS バイナリシーケンス決意ノード、回答を得るためにいじりで、次いで内部ノード。
1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 の#define N 200005 4 の#defineっ長い長い 5 int型 V、最後に、ANS、[N << 1 ]、SZ [N << 1 ]、MI [N << 1 ]、ID [N << 1 ] 、LEN [N << 1 ]、FA [N << 1 ]、CH [N << 1 ] [ 31 ]。 6 LL kを、MOD、L [N << 1 ]、合計[N << 1 ]。 7 チャーS [N]。 8 ボイド追加(INT C){ 9 INTP =最後、NP = = ++最後のV; 10 LEN [NP] = LEN [P] + 1 。 11 SZ [NP] = 1 。 12 のために((P)&&(CH [P] [C]);!p = FA [P])CH [P]は[C] = Vします。 13 もし FA [NP] =(pは!)1 。 14 他{ 15 INT Q = CH [P]、[C]。 16 であれば(LEN [Q] == lenの[P] + 1)FA [NP] = Q。 17 他{ 18 INT NQ = ++ V。 19の LEN [NQ] = LEN [P] + 1 。 20件 のmemcpy(CH [NQ]、CH [Q]、sizeof (CH [Q]))。 21 FA [NQ = FA [Q]。 22の FA [NP] = FA [Q] = NQ。 23 のために((P)&&(CH [P] [C] == Q); P = FA [P])CH [P]、[C] = NQ。 24 } 25 } 26 } 27の 空隙 DFS(int型K){ 28 [++ 0 =]] K。 29 のためには、(int型 i = 0 ; iは< 26 ; iは++ ) 30 であれば(CH [K] [i])とDFS(CH [K] [I])。 31 } 32 int型のmain(){ 33 int型のT; 34 のscanf(" %sの%のD "、S&T)。 35 V =最後= 1 。 36 INT N = STRLEN(S)。 37 のためには、(int型 I = N- 1、I> = 0 ; I - )(S [I] -追加' Aを' ); 38 のために(int型 i = 1 ; iが= Vを<; I ++)は[LEN [I]] ++ ; 39 のためには、(int型 I = 1 [I] + = [I-iが++; iがn = <)1 ]。 40 のために(int型 I = 1 iが= Vを<; I ++)は、ID [LEN [I]] - ] = I。 41 のために(int型 I = 1、J = N; iが= Vを<; Iは++ ) 42 であれば(SZ [i])とMI [I] = - J。 43 のmemset(0、はsizeof (a)参照)。 44 のために(int型 V = Iと、iは; i-- ){ 45 SZ [FA [ID [I]]] + = SZ [ID [I]]。 46 マイル[FA [ID [I]]] = MI [ID [I]]。 47 } 48 のための(int型 V = Iと、私は、I - )がL [I] =(LEN [FA [I] + LEN [I] + 1LL)*(LEN [I] -len [FA [I] ])/ 2* SZ [i]は、 49 のmemset(CH、0、はsizeof (CH))。 50 のためには、(int型 i = 1 ; iは= Vを<; iは++)CH [FA [I] [S [M [I] + LEN [FA [I]]] - [ A ' ] = I。 51の DFS(1 )。 52 のために(int型 i = 1 ; iが= Vを<; I ++)は和[I] =和[I- 1 ] + L [I]]。 53 一方(t-- ){ 54 のscanf(" %のLLDの%のLLD "、&K、&MOD)。 55 + K = K * ANS%はMOD1 ; 56 INT P = LOWER_BOUND(和+ 1、和+ V + 1、K) - 和。 57 K- =和[P- 1 ]。 58 、P = [P]。 59 INT X = LEN [FA [P]] + 1、yは= LEN [P]を。 60 一方(X < Y){ 61 INT半ば=(X + Y >> 1 )。 62 であれば((MID + LEN [FA [P]] + 1LL)*(中間LEN [FA [P])/ 2 * SZ [P]> = K)Y = ミッド。 63 他のx =ミッド+ 1 ; 64 } 65 K - =(X + LEN [FA [P]])*(X-1LL-LEN [FA [P])/ 2 * SZ [P]。 66 のprintf(" %のCする\ n "、S [(K- 1)%X + MI [P])。 67の ANS + = S [(K- 1)%X + MI [P]]。 68 } 69 }