BZOJ2124 等差子串行 線段樹 hash

2021-08-16 18:04:16 字數 857 閱讀 7157

傳送門

給出乙個n的排列,問是否存在乙個長度至少為3的等差子串行

n<=10000

注意到我們給出的是乙個排列,而且我們只需要找長度為3的子串行即可

那麼我們可以列舉中間項x,用01串s和t來表示x前面的數中[1,x-1]和[x+1,x+x-1]是否出現,每次判斷串s和t的反串是否相等即可,如果不相等說明會出現等差子串行

判斷兩個串是否相等,我們很容易就可以想到雜湊,再用線段樹維護雜湊值即可

**:

#include

#include

#define ull unsigned long long

using namespace std;

ull mi[10010];

int t,n,a[10010];

const int bas=3;

struct treetr[40010];

void update(int i)

void build(int i,int l,int r)

void add(int i,int

x) int mid=l+r>>1;

if (mid>=x) add(i<<1,x);

else add(i<<1|1,x);

update(i);

}ull queryha(int i,int l,int r)

ull queryah(int i,int l,int r)

int main()

add(1,a[i]);

}if (p) printf("y\n");else

printf("n\n");

}}

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...