Zhentiウォークスルー2

ACM-ICPC 2017アジア青島

 

B. Chenchen、Tangtang、ZengZeng

質問にサインイン

 

I.二乗モスキートコイル

質問を印刷してください、元の地域の競争にもこの種の質問があり、言葉が出ません...

概要:この状況では、落ち着きが最も重要です。

 

J.サフィックス

暴力がタイムアウトするのは当然のことですが、質問データは比較的低いですか?激しい問題になりました。次に、それを最適化します。ここで、他の人が最長の接頭辞+文字列ハッシュを見つけて高速化するための2つのポイントがあることがわかります

同時に、この質問は逆の考え方を使用する必要があり、最適な状況に対応するために逆に推し進める必要があります。

#include <bits / stdc ++。h>
 #define debug freopen( "r.txt"、 "r"、stdin)
 #define mp make_pair
 #define ri register int 
 using  namespace std;
typedef long  long ll;
typedef unsigned long  long eye;
const  int maxn = 2e5 + 10 ;
const  int型 INF = 0x3f3f3f3f const  int mod = 998244353 ;
const  int  base = 233 ;
インラインll read(){ll s = 0、w = 1 ; char ch = getchar();
while(ch < ' 0 ' || ch> ' 9 '){ if(ch == ' - ')w = -1 ; ch = getchar();}
 while(ch> = ' 0 ' && ch <= ' 9 ')s = s * 10 + ch- ' 0 '、ch = getchar();
s * w;}を返す
ll qpow(ll p、ll q){ return(q&1?p:1)*(q?qpow(p * p%mod、q / 2):1)%mod;}
 int T、n、i、len [maxn]、pos、nowlen、j、l、r、mid;
文字列s [maxn];
ull Hash [maxn];
ull pw [maxn];
void init()
{
    pw [ 0 ] = 1 ;
    for(ri i = 1 ; i <= maxn; i ++)pw [i] = pw [i- 1 ] * base ;
}
ull getHash(int l、int r)
{
    Hash [r] -Hash [l- 1 ] * pw [r-l + 1 ]を返します。
}
int main()
{
    T = read();
    初期化();
    ながら(T-- 
    {
        n = read();
        for(i = 1 ; i <= n; i ++ 
        {
            cin >> s [i];
            len [i] = s [i] .size();
        }
        s [ 0 ] = "" ;
        (; I; i-- iがN = 
        {
            pos = 1 ;
            nowlen = s [i] .size();
            for(j = 0 ; j <nowlen; j ++)Hash [j + 1 ] = Hash [j] * base +(s [i] [j]- ' a ' );
            for(j = 1 ; j <= len [i]; j ++ 
            {
                l = 0、r = nowlen-j + 1 ;
                while(l < r)
                {
                    mid =(l + r + 1)>> 1 ;
                    if(getHash(pos、pos + mid- 1)== getHash(j、j + mid- 1))l = mid;
                        それ以外の場合は r = mid- 1 ;
                }
                if(pos-l + 1 <nowlen && s [i] [pos- 1 + l]> s [i] [j- 1 + l])
                {
                    pos = j;
                }
            }
            s [i - 1 ] + = s [i] .substr(pos- 1、nowlen-pos + 1 );
        }
        cout << s [ 0 ] << endl;
    }
     0を返します
}
コードを表示

 

K.西安の旅の終わり

まず、たくさんの質問があります。質問の意味を読むと、この質問がコストフローであることがわかります。テンプレートを作成できます。

概要:あなたに属するテンプレートの波を整理する時が来ました。

 

おすすめ

転載: www.cnblogs.com/Y-Knightqin/p/12728563.html