(个人水平有限,请见谅!)
题目描述:
给定整数m以及n个数字A1,A2,…An,将数列A中所有元素两两异或,共能得到n(n-1)/2个结果,请求出这些结果中大于m的有多少个。
输入描述:
第一行包含两个整数n,m。
第二行给出n个整数A1,A2,…,An。
数据范围:
对于30%的数据,1 <= n, m <= 1000
对于100%的数据,1 <= n, m, Ai <= 10^5
输出描述:
输出仅包括一行,即所求的答案。
输入:
3 10
6 5 10
输出:
2
代码示例1(常规算法):
// 该算法只通过60%测试样例,其余均超时。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n, m, temp;
long long sum;
cin >> n >> m;
vector <int> array(n,0);
for (int i = 0; i < n; i++)
{
cin >> temp;
array[i] = temp;
}
//cout << array.size() << " ";
for (int i = 0; i < n; i++)
{
for (int j = i+1; j < n; j++)
{
int temp = array[i] ^ array[j];
if (temp > m)
sum++;
}
}
cout << sum << endl;
}
代码示例2(查找树)
#include <iostream>
#include <vector>
using namespace std;
struct TrieTree
{
int count;
struct TrieTree* next[2]{NULL, NULL};
TrieTree():count(1){}
};
TrieTree* buildTrieTree(vector <int>& array)
{
TrieTree* trieTree = new TrieTree();
for (int i = 0; i < (int)array.size(); i++)
{
TrieTree* cur = trieTree;
for (int j = 16; j >= 0; j--)
{
int digit = (array[i] >> j) & 1;
if (cur->next[digit] == NULL)
cur->next[digit] = new TrieTree();
else
(cur->next[digit]->count)++;
cur = cur->next[digit];
}
}
return trieTree;
}
long long queryTrieTree(TrieTree*& trieTree, int a, int m)
{
TrieTree* cur = trieTree;
long long val = 0;
for (int i = 16; i >= 0; i--)
{
int adigit = (a >> i) & 1;
int mdigit = (m >> i) & 1;
if (adigit == 0 && mdigit == 1)
{
if (cur->next[1] == NULL)
break;
cur = cur->next[1];
}
else if (adigit == 1 && mdigit == 1)
{
if (cur->next[0] == NULL)
break;
cur = cur->next[0];
}
else if (adigit == 0 && mdigit == 0)
{
val += (cur->next[1] == NULL) ? 0:cur->next[1]->count;
if (cur->next[0] == NULL)
break;
cur = cur->next[0];
}
else if (adigit == 1 && mdigit == 0)
{
val += (cur->next[0] == NULL) ? 0:cur->next[0]->count;
if (cur->next[1] == NULL)
break;
cur = cur->next[1];
}
}
return val;
}
long long solve(vector <int>& array, int m)
{
TrieTree* trieTree = buildTrieTree(array);
long long result = 0;
for (int i = 0; i < (int)array.size(); i++)
result += queryTrieTree(trieTree, array[i], m);
return result/2;
}
int main()
{
int n, m;
while (cin >> n >> m)
{
vector <int> array(n,0);
for (int i = 0; i < n; i++)
cin >> array[i];
cout << solve(array, m) << endl;
}
return 0;
}