CF1582F2 Korney Korneevich and XOR 题解
思路
dp 然后优化。
设 表示是否有末尾数 ,异或和为 的子序列。对于具体的数,其实不用关心。
假设现在处理 ,枚举异或和 ,那么所有 都会被更新。
下面优化:
-
对于相同的异或和,如果 已经被更新,那么 都被更新了,我们设立数组 为需要枚举到 。 无需枚举。
-
第二维的枚举太慢了,假如都是每个状态都是 ,就浪费时间。可以设一个 ,记录异或和为 时要枚举哪些 值。更新完就全部删除。(类似 spfa)
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10,M = 8192;
int n,v[M],m[M],ans=1;
vector<int>b[M];//每个<ai要枚举哪些
int main() {
cin>>n;
v[0]=1;
for(int i=1;i<=M-1;i++) {
m[i]=M-1;b[i].push_back(0);
}
for(int i=1,t;i<=n;i++) {
cin>>t;
for(int j:b[t]) {
int k=t^j;
if(v[k]==0) ans++;
v[k]=1;
while(m[k]>t) b[m[k]--].push_back(k);
}
b[t].clear();
b[t].push_back(0);
}
cout<<ans<<endl;
for(int i=0;i<M;i++) if(v[i]) cout<<i<<" ";
return 0;
}

浙公网安备 33010602011771号