長さmの配列bために我々は関数fを定義します
F(B)= {B [1] F(B [1]⊕b[2]、B [2]⊕b[3]、...、B [M-1]⊕b[M])であれば、M = 1otherwise 、
⊕はビットごとの排他的論理和です。
例えば、F(1,2,4,8)= F(1⊕2,2⊕4,4⊕8)= F(3,6,12)= F(3⊕6,6⊕12)= F (5,10)= F(5⊕10)= F(15)= 15
あなたは配列aを与えられ、いくつかのクエリ。各クエリは、二つの整数LとRとして表されます。その答えは、アレイらの全ての連続サブセグメント上のFの最大値、アル+ 1、...、ARです。
入力
の長さ-最初の行は、単一の整数n(1≤n≤5000)を含みます。
配列の要素 - 2行目は、A1、A2、...、(0≤ai≤230-1)が含まnは整数。
クエリの数 - 第三行は、単一の整数q(1≤q≤100000)を含みます。
次Q線の各々は、二つの整数L、R(1≤l≤r≤n)として表されるクエリを含みます。
出力
プリントQライン-クエリの答え。
例
入力
3
8 4 1
2
2 3
1 2
出力
5
12
入力
6
1 2 4 8 16 32
4
1 6
2 5
3 4
1 2
出力
60
30
12
3
注意
関数の最大値は、両方のクエリの最初のサンプルで全セグメントに等しいサブセグメントに達します。
第二のサンプルでは、最初のクエリのための最適なセグメントは、[3,6]、2番目のクエリのために - [2,5]、第三のために - [3,4]、第四のための - [1,2]。
問題の意味:
F {B1、B2、B3 ... BNは}トップ結果パスカルの三角形の結果であり、底部はB1、B2、B3 ...である
上位ノードB1、B1 ^ B2、B2、上位ノードのB3にB2 B2 ^ B3へ。そう
最大デマンドサブセグメント間隔F(L、R)の
思考:
結論付けることができるB [i]は[J] = B [I + 1] [J] ^ B [i]は[J - 1]。
次いで、F [i] [j]の定義は、Jサブセグメント値、B [i]は[J]に対するI間隔最大は、J XOR演算パスカルサブセグメントIです。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[5005];
int b[5005][5005],f[5005][5005];
int main()
{
int n;scanf("%d",&n);
for(int i = 1;i <= n;i++)
{
scanf("%d",&a[i]);
b[i][i] = f[i][i] = a[i];
}
for(int len = 2;len <= n;len++)
{
for(int i = 1;i + len - 1 <= n;i++)
{
int j = i + len - 1;
b[i][j] = b[i + 1][j] ^ b[i][j - 1];
f[i][j] = max(b[i][j],max(f[i + 1][j],f[i][j - 1]));
}
}
int q;scanf("%d",&q);
while(q--)
{
int l,r;scanf("%d%d",&l,&r);
printf("%d\n",f[l][r]);
}
return 0;
}