站外异或题求助
  • 板块学术版
  • 楼主DeusExMachina
  • 当前回复30
  • 已保存回复30
  • 发布时间2022/10/3 18:47
  • 上次更新2023/10/27 09:00:07
查看原帖
站外异或题求助
361833
DeusExMachina楼主2022/10/3 18:47
// 五十多行火车头优化省略了
#include <bits/stdc++.h>
using namespace std;

int n, s, a[1919810];
int ax[1919810];
map <int, int> m;

signed main () {
  scanf ("%d%d", &n, &s);
  for (int i = 1; i <= n; i++) {
    scanf ("%d", &a[i]);
    ax[i] = (a[i] ^ s);
    m[a[i]]++;
  }
  if (s == 0) {
    printf ("%d\n", n);
    exit (0);
  }
  int ans = 0;
  for (int i = 1; i <= n; i++) {
    ans += m.find (ax[i])->second;
  }
  printf ("%d\n", ans);
}

题目大意:给出 nnss 以及长度为 nn 的集合 aa,让你求集合中满足 aixoraj=sa_i \operatorname{xor} a_j = s 的数对个数,(i,j)(i, j)(j,i)(j, i) 视作不同数对。

思路:aixoraj=saixoraj=sa_i \operatorname{xor} a_j = s \Rightarrow a_i \operatorname{xor} a_j = s。记录每一个 aixorsa_i \operatorname{xor} s,用 std::map 记录出现每个数的出现次数。

1n1061\le n \le 10^61ai2301 \le a_i \le 2^{30}1s2301 \le s \le 2^{30}

不开火车头 TLE 50pts,开了之后 TLE 70pts,求助要怎么优化 QAQ

2022/10/3 18:47
加载中...