BZOJ2124 等差子串行(樹狀陣列 雜湊)

2022-05-20 19:07:13 字數 868 閱讀 9263

容易想到一種暴力的做法:列舉中間的位置,設該位置權值為x,如果其兩邊存在權值關於x對稱即合法。

問題是如何快速尋找這個東西是否存在。考慮僅將該位置左邊出現的權值標1。那麼若在值域上若關於x對稱的兩權值標號不同,說明他們的位置分別在兩側,也就說明存在等差子串行。那麼只需要判斷整體是否相同,雜湊即可。

雜湊值需要動態維護,容易想到樹狀陣列/線段樹。從左到右依次處理並維護兩個樹狀陣列記錄正反雜湊值。

#include#include

#include

#include

#include

#include

using

namespace

std;

intread()

while (c>='

0'&&c<='

9') x=(x<<1)+(x<<3)+(c^48),c=getchar();

return x*f;

}#define n 10010

#define ul unsigned long long

intt,n,a[n];

ul tree[n],tree2[n],p[n];

void add(int k)

void add2(int k)

ul query(

int k)

ul query2(

int k)

intmain()

}else

}add(a[i]);add2(a[i]);

}if (flag) printf("

y\n");else printf("

n\n"

); }

return0;

}

BZOJ2124 等差子串行

挺厲害的題 我們考慮當前加入了第i個數,為x,那麼我們可以維護一下哪個數出現過,出現過為1,沒出現為0,那麼加入x的時候我們只需要判斷以x為中心的極長子串是否是回文串即可 用乙個樹狀陣列維護兩個方向的雜湊值即可 include include include include include incl...

bzoj 2124 等差子串行

description 給乙個1到n的排列,詢問是否存在1 p1 p2 p3 p4 p5 plen n len 3 使得ap1,ap2,ap3,aplen是乙個等差序列。input 輸入的第一行包含乙個整數t,表示組數。下接t組資料,每組第一行乙個整數n,每組第二行為乙個1到n的排列,數字兩兩之間用...

BZOJ 2124 等差子串行

給乙個1到n的排列,詢問是否存在 3 plen 使得ap1,ap2,ap3,aplen是乙個等差序列。輸入的第一行包含乙個整數t,表示組數。下接t組資料,每組第一行乙個整數n,每組第二行為乙個1到n的排列,數字兩兩之間用空格隔開。對於每組資料,如果存在乙個等差子串行,則輸出一行 y 否則輸出一行 n...