E - あなたはいくつかの文字列... CodeForcesを与えられている - 1202E

#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 ;
}

 

おすすめ

転載: www.cnblogs.com/zhangzhenjun/p/11746002.html