【ccKILLKTH] Killjeeとk番目の文字

(挿入の逆の順序で、すなわち、文字列接尾辞木を確立木)、その後に合わせて見つけることができ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 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/PYWBKTDA/p/11254575.html