実際には、一般的な感覚は難しいことではありません
昨日は、2番目の質問が放棄されました
簡単に言えば数学+木の少しの組み合わせは、少し辞書です
デジタルDPのように
#include <ビット/ STDC ++ H> の#define戻り再 の#define INC(I、L、R)のための(++ I; I <= R LL iはL =)を 使用して、 名前空間STDを、 テンプレート <型名T>インラインボイド RD(T&X) { チャー C。BOOL F = 0 。 一方、((C = GETCHAR())< ' 0 ' || C> ' 9 ')であれば(C == ' - ')、F = 1 。 X = C ^ 48 。 一方、((C = GETCHAR())> = ' 0' &&のC <= ' 9 ')、X = X * 10 +(C ^ 48 )。 もし(F)X = - X。 } の#defineは長い長いっ LL N、K。 CONST INT MAXN = 1000005、MOD = 1E9 + 7 。 LLのTOT、TR [MAXN] [ 27 ]、ED [MAXN]、CNT [MAXN]。 チャーS [MAXN]。 インラインボイド挿入() { LL LEN = STRLEN(S + 1 )。 RT LL = 0 。 INC(I、1 、LEN) { もし(!TR [RT] [S [i]は- ' A ' ]) TR [RT] [S [i]は - ' ' ] = ++ TOT; RT = TR [RT] [S [I] - [ A ' ]。 } ED [RT] = 1 。 ++ CNT [RT]。 } インラインボイドDFS(LLのRT) { 場合(ED [RT])再。 INC(I、0、25 ) であれば(TR [RT] [I]) { DFS(TR [RT] [I])。 CNT [RT] + = CNT [TR [RT] [I]]。 } } のLL SLEN、ST = 1 。 LL JC [MAXN]、jcinv [MAXN]、ANS、回答、CNT。 インラインボイド検索(LLのRT) { 場合(ED [RT]) { アンス =(ANS + JC [N-CNT] * jcinv [NK]%MOD * ANS%のMOD)%MOD。 CNT [RT] - 。 再; } のLLのX = Sで[ST] - [ A ' 。 INC(I、0、25 ) 場合(iは< X) { 場合(TR [RT] [i])とANS + = CNT [TR [RT] [I]]。 // 因为下标从0开始 } 他の { ++ ST; ([X] [RT] TR)を見つけます。 CNT [RT] - 。 再; } } インラインボイドGet_jc() { jcinv [ 0 ] = jcinv [ 1 ] = JC [ 1 ] = JC [ 0 ] = 1 。 INC(I、2 、n)の { JC [I] = JC [I- 1 ] * I%MOD。 jcinv [I] =(MOD-MOD / I)* jcinv [MOD%I]%MOD。 } INC(I、2、n)のjcinv [I] = jcinv [I- 1 ] * jcinv [I]%モッド; } int型のmain() { freopenは(" in.txt "、" R " 、STDIN)。 RD(n)は、RD(K); INC(I、1 、N) { scanf関数(" %sの"、S + 1 )。 インサート(); } DFS(0 )。 Get_jc(); scanf関数(" %sの"、S + 1 )。 一方(CNT < K) { ++ CNT。 ANS = 0; (見つける0 ); } のprintf(" %のLLD "、(ANS + 1)%のMOD)。 再0 ; }