3 5 1 2 3 4 5 2 2 4 3 4 0 4
1 3 -1 2 2
这道题 做了好久 用了好多方法
第一次没有考虑n的范围 就直接用o(n*n)的时间复杂度做的 而且还不知道可以直接用异或符号^ 自己定义的 结果TLE
然后又用的线段树 发现少考虑情况了 如果加上少考虑的情况 进行n*n此查找 肯定会超时 就提前结束了
最后想的要么是贪心 要么是dp 贪心自己真的不知道如何贪心 于是就用了dp
dp数组分别为 t个数的异或的和
使用t++ 更新异或和的个数
看代码吧
#include <stdio.h>
#include <string.h>
int a[1000000+5];
int dp[1000000+5];
int main()
{
int ncase;
scanf("%d",&ncase);
while(ncase--)
{
memset(a,0,sizeof(a));
memset(dp,0,sizeof(dp));
int n,flag=-1;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
dp[i]=a[i];
if(dp[i]==0&&flag==-1)
flag=i;
}
if(flag!=-1)
{
printf("%d %d\n",flag+1,flag+1);
continue;
}
int right=-1,left=0,t=0;
while(right-left==-1)
{
t++;
if(t>n)
break;
for(int i=0;i<n;i++)
{
if(i+t<n)
{
dp[i]=dp[i]^a[i+t];
if(dp[i]==0)
{
right=i+t;
left=i;
break;
}
}
else
break;
}
}
if(right-left==-1)
printf("-1\n");
else
printf("%d %d\n",left+1,right+1);
}
}XOR Segment (动态规划||苏州大学计算机学院三月月赛暨蓝桥杯热身赛)
原文:http://blog.csdn.net/su20145104009/article/details/50896686