-- 题意:在给定的数组中,往后面加入一个异或出来的值,求加入的值中最大的哪一个是多少。
| 赛时想法:模拟加入的过程,将异或最大的添加到数组后面,直到重复为止。在输出最大值。
这个会TLE,数据范围1e5;
正确思路:异或性质 a^a^a=a a^b^a=b。添加异或的值为后缀的值。我们可以将一些异或起来小的给添加到末尾,与前面的抵消。 也就是求某段区间的最大异或值。
某段区间的最大值我们可以这样表示(学习别人的):先将前 n 个数异或值为 cnt 。保存每个数异或的值,我们可以异或前面存在的一个前缀值来表示我们这段的异或值。
#include<iostream>
using namespace std;
const int N=1e5+5;
int st[300];
void re()
{
for(int i=0;i<=256;i++) st[i]=0;
}
int main()
{
int T;
cin>>T;
while(T--)
{
re();
int m,x;
cin>>m;
int ans=0,cnt=0;st[0]=1;
for(int i=1;i<=m;i++)
{
cin>>x;
cnt^=x;
st[cnt]=1;
for(int j=0;j<=256;j++)
{
if(st[j])
{
ans=max(ans,cnt^j);
}
}
}
cout<<ans<<'\n';
}
return 0;
}
总结:这场 B 可以少罚一点,自己以为懒得优化TLE4次。C题两点没有想到,1是提议的转化,只想着模拟过程,缺少考虑。2是对 区间最大异或值 不了解。