BZOJ 4300 絕世好題

2021-09-30 20:10:15 字數 1614 閱讀 6022

傳送門

description

給定乙個長度為 n

nn 的數列 a

ia_i

ai​,求 a

ia_i

ai​ 的子串行 b

ib_i

bi​ 的最長長度,滿足 bi&

bi−1

≠0(2

≤i≤l

en

)b_i\&b_\ne0(2\le i\le len)

bi​&bi

−1​̸

​=0(

2≤i≤

len)

input

輸入檔案共 2

22 行。

第一行包括乙個整數 nnn。

第二行包括 n

nn 個整數,第 i

ii 個整數表示 a

ia_i

ai​。

output

輸出檔案共一行。

包括乙個整數,表示子串行bi的最長長度。

sample input

31 2 3

sample output2

hint

n

≤100000,a

i≤2×

10

9n\le100000,a_i\le2\times10^9

n≤1000

00,a

i​≤2

×109

一道比較妙的 dp 題

暴力應該是不難想的,用類似求最長上公升子串行的方法,複雜度是 n

2n^2

n2下面就說一下正解

由題中 &

\&&(與)知道這是和位運算有關的,很容易就想到在各個位上搞

首先是 &

\&& 的性質(1&1

=1,1

&0=0

,0&1

=0,0

&0=0

1\&1=1,1\&0=0,0\&1=0,0\&0=0

1&1=1,

1&0=

0,0&

1=0,

0&0=

0)記錄 f(i

)f(i)

f(i)

表示第 i

ii 位上滿足條件的最長長度,將每個數拆成二進位制,只有當前位為 1

11 時,才更新答案

具體的轉移方程就看**吧,應該不難理解

#include

#include

#include

#define n 100005

using

namespace std;

int a[n]

,f[50];

intmain()

for(i=

0;i<=30;

++i)

max=

max(max,f[i]);

printf

("%d"

,max)

;return0;

}

BZOJ4300 絕世好題

description 給定乙個長度為n的數列ai,求ai的子串行bi的最長長度,滿足bi bi 1 0 2 i len input 輸入檔案共2行。第一行包括乙個整數n。第二行包括n個整數,第i個整數表示ai。output 輸出檔案共一行。包括乙個整數,表示子串行bi的最長長度。sample in...

bzoj4300 絕世好題

絕世傻題 既然要求bi andb i 1 0,那麼就讓他一定成立咯。從1到n列舉,當前數為x,前面的數都操作完了,那麼 fx max 1,然後再更新一下gi 沒了 淦。一開始寫了發trie。寫完才發現根本不對啊tat 好虛啊老是犯這種錯 include define rep i,a,b for in...

BZOJ 4300 絕世好題

de scri ptio n 給定乙個長度為 n 的數列ai 求ai 的子串行bi 的最長長度,滿足bi bi 1 0 2 i len in put 輸入檔案共 2 行。第一行包括乙個整數n。第二行包括 n 個整數,第 i個整數表示ai out put 輸出檔案共一行。包括乙個整數,表示子串行bi ...