まず、の状態を定義 Fを[I] [J] の長さを表しI に文字列をjの資格を文字列の終了番号は$ Fを発見した[I] [J] = \ SUM F [I-1] [K] $( J 及びKは隣接していてもよい)、行列乗算はそれを最適化することができます。
1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 の#defineっ長い長 4 の#define MOD十億七 5 構造体JI { 6 LL [ 31 ] [ 31 ]。 7 } A、B、C。 8 のLL N、ANS。 9 チャー S [ 100001 ]。 10 ジ・チェン(JI A、JI b)は{ 11 のmemset(CA、0、はsizeof (CA))。 12 のために(int型 I = 0 ; iが< 26; I ++ ) 13 のための(INT J = 0 ; J < 26 ; J ++ ) 14 であれば(AA [I] [J]) 15 のための(int型のk = 0 ; K < 26 ; kは++)CA [i]は[K] = (CA [i]が[K] + AA [I] [J] * BA [J] [K])%MOD。 16 リターンC; 17 } 18 INT メイン(){ 19 のscanf(" %LLD%S "、およびN、S)。 20 のために(int型 I = 0 ; iが< 26 ; iが++ ) 21 のための(int型 J = 0 ; J < 26 ; J ++)AA [I] [J] = 1 。 22 のためには、(int型 I = 0 ; S [I + 1 ]; I ++)のA-A [S [I] - [ A ' ] [S [I + 1 ] - [ A ' ] = 0 ; 23 のために(int型 I = 0 ; iが< 26 ; iが++)BA [i]は[I] = 1 。 24 のために(N - ; T; N >> = 1 ){ 25 であれば(N - 1)B =チェン(B、A)。 26 = チェン(A)。 27 } 28 のための(int型 i = 0 ; iは< 26 ; I ++ ) 29 のための(INT J = 0 ; J < 26 ; J ++)ANS =(ANS + BA [I] [J])%MOD。 30 のprintf(" %のLLD " 、ANS)。 31 }