输入数组:5,2,7,100,1090,1,3,6,4,1062(从0开始编号的数组)
任务:对于给定的正整数序列,我想找出满足条件 1 ≤ i < j ≤ k ≤ N 并且 A[i]^…^A[j]−1=A[j]^A[j]+1^…^A[k] 的三元组 (i,j,k) 的数量,其中 ^ 表示按位异或。
我已经尝试使用 C++ 中的前缀异或数组和映射来解决这个问题,但是仍需要改进时间复杂度。
cin >> n;
int A[n];
ll count = 0;
unordered_map<int, vector<int>> map_table;
for (int i = 0; i < n; ++i)
cin >> A[i];
map_table[A[0]].push_back(0);
for (int i = 1; i < n; ++i)
{
A[i] = A[i] ^ A[i-1];
if (!A[i])
count += i;
map_table[A[i]].push_back(i);
}
unordered_map<int, vector<int>>::iterator i2;
for (i2 = map_table.begin(); i2 != map_table.end(); ++i2)
{
int size = i2->second.size();
if (size >= 2)
{
for (int i = 0; i < size-1; ++i)
{
for (int k = i+1; k < size; ++k)
count += ((i2->second[k])-(i2->second[i])-1);
}
}
}
cout << count << '\n';
在这个例子中,答案是20。
[0,2],[5,8],[0,9],[3,9]
XOR(5, 2, 7) = 0; XOR(1, 3, 6, 4) = 0; XOR(100, 1090, .... 1062) = 0; XOR(5, 2, 7 .... 1062) = 0
int A[n];
-- 这是无效的 C++ 代码。既然您已经在使用std::vector
,为什么不在这里也使用呢?std::vector<int> A(n);
。 - PaulMcKenziefor (int i = 0; i < size-1; ++i) { for (int k = i+1; k < size; ++k)
,你就走错了方向。 - PaulMcKenzieO(n*n)
。如果你已经意识到了这一点,那么你应该尝试改进它。如果你从一个“在线评测”网站得到了这个问题,这些网站以出题让程序员给出天真、缓慢解决方案而闻名。他们希望你能跳出思维定势,想出一个不天真/不缓慢的解决方案。 - PaulMcKenzie