#include <ビット/ STDC ++ H> の#define FRER()freopenは( "i.txt"、 "R"、STDIN)。 使用して 名前空間はstdを、 / * 交流オートマトン 我々はトン試合の[i]の数x、もしそのために、テキスト文字列のために、2つの文字列が接続されている考えます T [i]は、xは、後述するT [i]は、一連の端がXを有するされる抗ヴァル[i]はTの[]、レコードの製品を検索している文字列の末尾であります どのくらいの価値を反映するために、最終的な貢献 吸盤は、int型のCH、与えたのchar chのを入れて、私は漢漢でした * / typedefの長い 長いLL。 CONSTの INT MAXN = 2E5 + 100、M = 27 。 構造体BUT { INT CH [MAXN] [M]。 INT [MAXN] F。 int型 SZ = 1 ; INT C [MAXN]。 int型のval [MAXN]。 無効のinit() { memset(C、0、はsizeofのC)。 memsetの(F、0、はsizeof F)。 memset(ヴァル、0、はsizeof のVal); } int型のインデックス(char型のC) { リターン C- ' A ' ; } 空リアライズ(のchar *のS) { INT LEN = STRLEN(S)。 int型のu = 0 ; 以下のために(int型私= 0 ;私がlen <;私は++ ) { INT C = 指数(S [I])。 もし(!CH [U] [C]) CH [U] [C] = SZ ++ 。 U = CH [U] [C]。 } ヴァル[U] ++ ; } 無効はgetFileを() { F [ 0 ] = 0 ; キュー < 整数 > QUE。 以下のために(int型私= 0 ;私はMを<;私は++ ) { もし(CH [ 0 ] [i])と que.push(CH [ 0 ] [i])と、F [CH [ 0 ] [I] = 0 ; } しばらく(!que.empty()) { INT R = que.front()。 que.pop(); ヴァル[R] + = valの[R] [F]。 以下のために(int型私= 0 ;私はMを<;私は++ ) { INT U = CH [R] [I]。 もし(!U) { CH [R] [I] = CH [F [R] [i]は、 続け; } que.push(U)。 int型、V = F [R]。 F [U] =のCH [V] [I]。 } } } int型のフィン(のchar *のS) { INT LEN = STRLEN(S)。 int型 J = 0 ; 以下のために(int型私= 0 ;私がlen <;私は++ ) { J = CH [J] [S [I] - ' ' ]。 C [I] = valの[J]。 } } }ああ、ACH1。 int型のmain() { チャーS [MAXN]、S1 [MAXN]。 int型のn; scanf関数(" %sの" 、S); scanf関数(" %のD "、&N) ach.init()、ach1.init()。 以下のために(int型 i = 0 ; iがn <; iは++ ) { scanf関数(" %sの" 、S1)。 ach.inser(S1)。 逆(S1、S1 + STRLEN(S1))。 ach1.inser(S1)。 } ach.getFile()、ach1.getFile()。 ach.fin(S); INT LEN = STRLEN(S)。 逆(S、S + strlenを(S))。 ach1.fin(S); ANS LL = 0は、 のために(int型 I = 0 ;私がlen < 1。 ; I ++は)// lenの-1され、lenはありません { // のprintf( "i =%D ach.C [I] =%D%D%D \ n"は、I、ach.C [i]は、ach1.C [lenの-I-2]、lenの-I- 2)。 ANS + =(LL)ach1.C [I] *(LL)ach.C [lenの-I- 2 ]。 } printf(" %LLDする\ n " 、ANS)。 リターン 0 ; }