感觉是非常显然的dp(别打我)
预处理每个区间是否合法
预处理每个区间的异或价值
转移直接暴力去前面找左端点转移就是了
感觉没1900分┭┮﹏┭┮
#include <bits/stdc++.h>
using namespace std;
const int maxn=5009;
int n,a[maxn],vis[maxn],temp[maxn],dp[maxn];
int isok[maxn][maxn],xoR[maxn][maxn];
int main()
{
cin >> n;
for(int i=1;i<=n;i++) cin >> a[i],vis[ a[i] ]++;
for(int i=1;i<=n;i++)
{
memset( temp,0,sizeof(temp) );
int shu=0;
for(int j=i;j<=n;j++)
{
xoR[i][j]=xoR[i][j-1];
temp[ a[j] ]++;
if( temp[ a[j] ]==1 ) shu++,xoR[i][j]^=a[j];//出现不同数字的个数
if( temp[ a[j] ]==vis[ a[j] ]) shu--;//完全包含
if( shu==0 ) isok[i][j]=1;
}
}
for(int i=1;i<=n;i++)
{
dp[i]=dp[i-1];
for(int j=1;j<=i;j++)
if( isok[j][i] ) dp[i]=max( dp[i],dp[j-1]+xoR[j][i] );
}
cout << dp[n];
}