[Bzoj5508]ミスタートルエン文字列

まず、の状態を定義 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 }
コードの表示

 

おすすめ

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