大麦
T1
洪水のタイトル、最初の数文字が試験に不可解なパニックの同じグループの最後に追加かを確認するにはタイトル
その後、私たちは何の直接脳が$ Oをハッシュすることができなくなりますた(N)$
KMPもカットします
タイトル、小型の識別配列を注意深く読んで
書式#include <cstdioを> する#include <iostreamの> の#include <CStringの> に#define再登録 使って 名前空間はstdを、 typedefの符号なしの長い 長いULL。 CONSTの INT N = 200005、ベース = 131 。 int型T、LA、LB; ULL力[N]、HA [N]、HB [N]。 チャー A [N]、B [N]、ED [ 3 ]。 インラインボイドINI() { ため(int型 i = 0 ; iは=ラ<; I ++の) HA [I] = HB [i]は= 0; } インラインボイドワーク() { scanf関数(" %D%dの"、&LA、&LB); scanf関数(" %sの"、A + 1 )。 scanf関数(" %sの" 編); INI(); 用(RE INT i = 1 iは++; I <=ポンド) B [I] = A [i]は、 B [ ++ LB = ED [ 0 ]。 ため(再int型 I = 1 ; I <= LB; iは++ ) HB [I] = HB [I- 1] * 基底 + B [i]は、 用(RE INT i = 1 ; iが=ラ<; I ++の) HA [I] =ヘクタール[I- 1 ] * 基底 + A [i]は、 // デバッグ();ながら(1)。 int型 ANS = 0 ; ため(再int型 i = 1 ; iは=分(LA、LB)<; iは++ ) { 場合(I == 1 ) { 場合([ 1 ] == B [LB])ANS = 1 。 続け; } 場合(HA [I] == HB [LB] -Hb [LB-1] * 電力[i])と ANS = MAX(ANS、I)。 // COUT <<下駄(1、I)<<」「<< getb(LB-I + 1、LB)<< ENDL。 } のprintf(" %d個の\ n " 、ANS)。 } int型のmain() { scanf関数(" %のD "、&T)。 電力[ 0 ] = 1 ; 用(RE INT i = 1 ; iが= Nを<; I ++の) パワー[I] =電力[I- 1 ] * 基地; 一方、(T-- )ワーク(); リターン 0 ; }
T2
リンク1及びnは点ではないように、図塗装を省略しているいわゆる「唯一」に見出すことができます
これらの点は、元のポイントを切断しなければならず、満足は、nより長いユニコム後に削除します
だから、アイデアはおそらく出てきた:実行$ Tarjan $は、その後、ファックは第二の条件を満たして
nが決定されたカット点のサブツリーである場合にのみ、探索木を見つけるために後者を満たすことは困難
そして、この状態では、それは$ Tarjan $アルゴリズムが何であるかを反映するには?
すなわち、カット点xに対して、yは[Y] \当量DFN DFN $満たすために、それにポイントを接続し 、[n]は$
なぜ?
$実際に意味[] DFN $を考えてみましょう:各アクセスポイントのタイムスタンプがあり、我々はポイントを決定するためにそれを使用することができますしてアクセスする必要があります
異なるサブツリー(ない本当の状況)であり、Yおよびnの場合:
その後、最初の訪問とn yを参照してください。もちろん$ DFN [Y]> DFN [X] $は、満たされていません
逆:$のDFN [Y] $更新と$ [N] DFN更新され、満足していないではありません$
yの場合はnは同じツリーを持ちます:
Y N / YがNである前に:設立します
N Yの前に(ではない真):明らかに、この時点で$ DFN [Y]> DFN [n]は$、満たされていません
命題が証明されました。
インラインボイド tarjan(INT X) { 低い[X] =のDFN [X] = ++ IND。 int型フラグ= 0 。 以下のために(int型 I =ヘッド[X]; I; I = NXT [I]) { 場合(!DFN [する[I]]) { tarjan(の[I])。 低[X] = 分([I]に低、[x]は低いです)。 もし(> = [I]に低DFN [X]) { フラグ ++ 。 もし((X!= 1 ||フラグ> 1)&& DFN <= DFN [n]は[I]乃至])= [X] iscut1 ; } } そうでなければ低[X] = 分(低[X]、[I]乃至] DFN)。 } }
別の問題があります:あなたはDFN書くのは簡単であるn個のサブタッピングポイントで単一の思考をしたい場合は、[X] <DFN [n]は、
しかし、量は実際には十分ではありません、あなたが30ポイントを取得し、良い結果(霧
なぜ?
nはXの復帰から始まるルート上にある場合は終了しました。
ペイントは自分を再生することができます。
T3
形而上の質問、私は兄を参照してください問題のポイントソリューション
書式#include <cstdioを> する#include <iostreamの> の#include <CStringの> 使用して 名前空間はstd; typedefの長い 長いLL。 const int型 N = 1000005 ; constの INF = 11 0x7fffffffffff 。 int型T; チャーSTR [N]。 INT S [N << 1 ]、CNT [N << 1 ]、LEN。 LLヴァル[N << 1 ]。 ボイドINI() { ため(int型 i = 1 ; iがLEN = * < 2 ; I ++) S [i]は = CNT [I] = valの[I] = 0 ; } ボイドワーク() { LL ANS = INF。 scanf関数(" %sの"、STR + 1 )。 LEN = strlenを(STR + 1 )。 INI(); 以下のために(int型 i = 1 ; iは= LEN <; iは++ ) S [I] = sの[Iがlen +] =(STR [I] == ' B '?0:1 )。 / * ため(INT i = 1; iが<=(LEN << 1); iは++) COUT << S [i]は、* / のための(int型i = 1 ; iが=(LEN << < 1); iが++ ) CNT [I] = CNTを[I- 1 ] + S [i]は、ヴァル[I] = valの[I- 1 ] + i *がSを[I ]; int型のp = 1 ; 以下のために(int型 i = 1 ; iは= LEN <; iは++ ) { LL RES = INF。 用(INT ; J <私がlen + = + J = P 1、J ++ ) { LLのLNUM = CNT [J- 1 ] -cnt [I- 1 ]。 LLのRNUM = CNT [I + len- 1] -cnt [J- 1 ]。 LL和 =(ヴァル[J- 1 ] << 1)-Val [I- 1 ] -lnum * iが+ RNUM * 1LL *(I + len- 1)-Val [I + len- 1 ] - (lnum- 1)* LNUM / 2 - (rnum- 1)* RNUM / 2 。 もし(合計> RES)ブレーク。 RES =合計、P = J; ANS = 分(ANS、RES)。 } } COUT << ANS << ENDL。 } int型のmain() { //COUT << 0x7fffffffffff << ENDL、一方(1)。 scanf関数(" %のD "、&T)。 一方、(T-- )ワーク(); リターン 0 ; }