题目都告诉我们是“金字塔”了,不妨分析分析$f$的性质
$f(a_1,a_2)=f(a_1$ $xor$ $a_2)=a1$ $xor$ $a_2$
$f(a_1,a_2,a_3)=f(a_1$ $xor$ $a_2,a_2$ $xor$ $a_3)=a_1$ $xor$ $a_3=f(a_1,a_2)$ $xor$ $f(a_2,a_3)$
$f(a_1,a_2,a_3,a_4)=f(a_1$ $xor$ $a_2,a_2$ $xor$ $a_3,a_3$ $xor$ $a_4)=f(a_1$ $xor$ $a_3,a_2$ $xor$ $a_4)=a_1$ $xor$ $a_2$ $xor$ $a_3$ $xor$ $a_4=f(a_1,a_2,a_3)$ $xor$ $f(a_2,a_3,a_4)$
......
可以用数(da)学(li)归(da)纳(biao)法证明,$f(a_1,a_2,...,a_n)=f(a_1,a_2,...,a_{n-1})$ $xor$ $f(a_2,a_3,...,a_n)$
然后就是不会DP的蒟蒻都会做的区间(大概不算?)DP辣
设$dp[i][j]$表示$(i,j)$的最优答案,那么有枚举长度$i$和起点$j$,就有$dp[j][j+i-1]=max(max(dp[j+1][j+i-1],dp[j][j+i-2]),f(j,j+i-1))$,水水

1 //get~ 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int N=5005; 7 int num[N],xorr[N][N],dp[N][N]; 8 int n,m,t1,t2; 9 int xoring(int l,int r) 10 { 11 if(l==r) return num[l]; 12 if(~xorr[l][r]) return xorr[l][r]; 13 return xorr[l][r]=(xoring(l,r-1)^xoring(l+1,r)); 14 } 15 int main () 16 { 17 scanf("%d",&n); 18 for(int i=1;i<=n;i++) 19 scanf("%d",&num[i]); 20 scanf("%d",&m); 21 memset(xorr,-1,sizeof xorr); 22 for(int i=1;i<=n;i++) 23 for(int j=1;j<=n-i+1;j++) 24 dp[j][j+i-1]=max(max(dp[j+1][j+i-1],dp[j][j+i-2]),xoring(j,j+i-1)); 25 for(int i=1;i<=m;i++) 26 scanf("%d%d",&t1,&t2),printf("%d ",dp[t1][t2]); 27 return 0; 28 }