【思维】Codeforces Round 750 (Div. 2) F2. Korney Korneevich and XOR (hard version)
2021-10-25 19:54:00
# ACM
题目解析
这是 F1 的数据加强版;
定义一个严格上升子序列的 $f$ 值为该子序列的所有元素异或和,给定一个数组,求它的所有严格上升子序列能出现的 $f$ 值;
一个严格上升的子序列有这样的性质,第 $i+1$ 个数要比第 $i$ 个数大,且位置要更靠后;
始终维护两个数组:
$vis[i]$ 表示 $i$ 这个值能否是某个子序列异或和;
$pos[i]$ 表示异或出 $i$ 这个值的某个子序列末尾的最小位置;
于是用 $vector[a_i]$ 记录给定数组 $a_i$ 的所有位置,在 $vector[a_i]$ 中是按照位置递增排序的;
遍历每一个 $vector[i]$,考虑 $vis[[0,8192)]$ 是否存在,如果存在某个 $vis[j]$,$pos[j]$ 就是异或出 $j$ 这个值的某个子序列末尾的最小位置,二分查找 $vector[i]$ 中第一个大于 $pos[j]$ 的位置 $t$,如果存在的话那么 $vis[i \oplus j] = 1$ 并且更新 $pos[i \oplus j] = min(pos[i \oplus j], t)$;
最后所有 $vis[i] = 1$ 的值都是能得到的;
代码实现
1 |
|