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.西安の旅の終わり
まず、たくさんの質問があります。質問の意味を読むと、この質問がコストフローであることがわかります。テンプレートを作成できます。
概要:あなたに属するテンプレートの波を整理する時が来ました。