フェイス質問
https://www.luogu.org/problem/P2601
問題の解決策
二Weiha西(接頭辞と2次元、など)
右ベクトル:$ 107 $
$ 233 $:ベクトルを
私は$ WLS $と$ wym $の名前を取ることはありません
UPDは:突然、彼らは、2つの基底ベクトルとして、私が交差することはありません任意のポイントであることを楽しみにしているので、$を$と$ wymの$も非常に良いですWLS取って、と思いました。
(皮肉なことに、実際の生活の中で、彼らは7で1内に...と話をすることができたしています)
これらの愚かな事をしたくない、私はまだ、私はそれの良い女神だと思います。。。。。
書式#include <cstdioを> する#include <iostreamの> の#include <CStringの> に#define N 1050 の#define INTを登録里 の#define ULL符号なしの長い長い 使用して 名前空間はstd; CONST ULL P1 = 107、P2 = 233 。 ULL PP1 [N]、PP2 [N]。 INTのN、M。 INT [N] [N]。 構造体のハッシュ{ ULL SUM1 [N] [N]、SUM2 [N] [N]、SUM3 [N] [N]、sum4 [N] [N]。 無効のinit(){ ために(RI I = 1 ; I <= N; I ++ ) のための(RI J = 1 ; J <= M; J ++) SUM1 [I] [J] = SUM1 [I- 1 ] [j] * P1 + 1 SUM1 [I]、[J- 1 ] * P2-SUM1 [I- 1 ] [J- 1 ] *のP1 * P2は+ (ULL) [I] [J]。 用(; iは> = RI I = N 1 ; i-- ) のための(RIのJ = 1 ; J <= Mであり、j ++ ) SUM2 [I] [J] = SUM2 [iが+ 1 ] [j] * P1 + SUM2 [I]、[J- 1 ] * P2-SUM2 [I + 1 ] [J- 1 ] *のP1 * P2は+ (ULL)[I] [J]。 用(RI i = 1 ; I <= N; I ++ ) のための(RI J = M; J> = 1 ; j-- ) SUM3 [I] [J]= SUM3 [I- 1 ] [j] * P1 + SUM3 [I]、[J + 1 ] * P2-SUM3 [I- 1 ] [J + 1 ] *のP1 * P2は+ (ULL)[I] [J]。 用(Riはi = N; I> = 1 ; i-- ) のための(RI J = M; J> = 1 ; j-- ) sum4 [I] [J] = sum4 [I + 1 ] [j] * P1 + sum4 [I]、[J + 1 ] * P2-sum4 [I + 1 ] [j + 1 ] *のP1 * P2は+ (ULL)[I] [J]。 } ULL S1(int型、int型 B、int型のx、int型のy)を{ 戻り SUM1 [X] [Y] -sum1 [A- 1を] [Y] * PP1 [X-A + 1 ] -sum1 [X] [B- 1 ] * PP2 [Y-B + 1 ] + SUM1 [A- 1 ] [B- 1 ] * PP1 [X-A + 1 ] * PP2 [Y-B + 1 ]。 } ULL S2(int型、int型 B、int型のx、int型のY){ 戻り SUM2 [X] [Y] -sum2 [A + 1 ] [Y] * PP1 [-X + 1 ] -sum2 [X] [B- 1 ] * PP2 [Y-B + 1 ] + SUM2 [A + 1 ] [B- 1 ] * PP1 [-X + 1 ] * PP2 [Y-B + 1 ]。 } ULL S3(int型、int型 B、int型のx、int型のY){ 戻り SUM3 [X] [Y] -sum3 [A- 1 ] [Y] * PP1 [X-A + 1 ] -sum3 [X] [B + 1 ] * PP2 [B- Y + 1 ] + SUM3 [A- 1 ] [B + 1 ] * PP1 [X-A + 1 ] * PP2 [B-Y + 1 ]。 } ULL S4(int型、int型 B、int型のx、int型のY){ 戻り sum4 [X] [Y] -sum4 [A + 1 ] [Y] * PP1 [-X + 1 ] -sum4 [X] [B + 1 ] * PP2 [B-Y + 1 ] + sum4 [A + 1 ] [B +1 ] * PP1 [-X + 1 ] * PP2 [B-Y + 1 ]。 } INT CHECK1(int型のx、int型Y){ int型 LB = 1、RB =分(分(X- 1、Y- 1)、分(NX、M- Y))。 int型 RET = 0 ; 一方、(LB <= RB){ int型ミッド=(LB + RB)/ 2 。 ULLのT1 = S1を(X-MID、Y- 中間、X、Y) ULLのT2 = S2と(X + MID、Y- 中間、X、Y) ULLのT3 = S3を(X-MID、Y + MID、X、Y) ULLのT4= S4(X + MID、Y + MID、X、Y) もし(T1 == T2 && T2 == T3 && T3 == T4)RET =中間、LB =ミッド+ 1。他の RB =半ば1 。 } 戻り RET + 1 。 } INT CHECK2(int型のx、int型Y){ int型 LB = 1、RB =分(分(X- 1、Y- 1)、分(N- 1 -X、M- 1 - Y))。 int型 RET = 0 ; 一方、(LB <= RB){ int型ミッド=(LB + RB)/ 2 。 ULLのT1 = S1を(X-MID、Y- 中間、X、Y) ULLのT2 = S2と(X + 1 + MID、Y-MID、X + 1 、Y)。 ULLのT3 = S3を(X-MID、Y + 1 + MID、X、Y + 1 )。 ULLのT4 = S4と(X + +ミッド1、Y + +ミッド1、X + 1、Y + 1 )。 もし(T1 == T2 && T2 == T3 && T3 == T4)RET =中間、LB =ミッド+ 1。他の RB =半ば1 。 } 戻り RET + 1 。 } } H。 INT メイン(){ PP1 [ 0 ] =1 ; PP2 [ 0 ] = 1 ; 用(RI i = 1 ; iがNを<; I ++)はPP1 [I] = PP1 [I- 1 ] * P1、PP2 [I] = PP2 [I- 1 ] * P2。 scanf関数(" %d個の%のD "、&N、&M)。 用(RI i = 1 ; I <= N; I ++ ) のための(RI J = 1 ; J <= Mであり、j ++)のscanf(" %dの"、および[I] [J])。 H.init(); int型 ANS = 0 ; 用(RI i = 1 ; I <= N; I ++ ) のための(RI J = 1; J <= Mであり、j ++ ){ ANS + = H.check1(i、j)は、 場合([i] [j]は== [I + 1 ] [J] && [I + 1 ] [j] == [I]、[J + 1 ] && [I]、[J + 1 ] == A [I + 1 ] [j + 1 ])ANS + = H.check2(i、j)は、 } COUT << ANS << ENDL。 }