CF2667F - Bitwise Slides
题面
-
记
,那么由题意,进行 i 次操作后,有 。 -
因为 P,Q,R 这三个数字必须不成对地不同,所以这三个数字中必有一个为
,因为另外两个相同的数异或为 0。 -
考虑状态,对于
,其三元组状态包括 。 -
考虑转移:
对于 ,可以转移到 ,因为 ,可以操作等于 的那个值,共一个。
对于 可以 转移到 ,因为 ,可以操作等于 的那个值,共两个。
对于 可以 转移到 ,因为 ,可以操作等于 的那个值,共三个,此时不需要考虑第一种转移方案,这已经包含了那种情况。
-
直接 dp 会爆空间,发现实际有用状态很小,实际只有
,转移除了 都可以直接沿用上一次的状态,所以可以压维并离散化状态来减小空间。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=2e5+5,P=1e9+7;
ll n,a[N],p[N],c[N],d[N],f[N],ans;
void sol(){
cin>>n,ans=0,f[0]=1;
for(int i=1;i<=n;i++){
cin>>a[i];
p[i]=(p[i-1]^a[i]);
c[i]=p[i];
}
sort(c+1,c+n+1);
ll m=unique(c+1,c+n+1)-c-1;
for(int i=1;i<=n;i++){
d[i]=lower_bound(c+0,c+m+1,p[i])-c;
}
for(int i=1;i<=n;i++){
f[d[i-1]]=(3*f[d[i-1]]+2*f[d[i]])%P;
}
for(int i=0;i<=n;i++){
(ans+=f[d[i]])%=P;
f[d[i]]=0;
}
cout<<ans<<'\n';
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T;
cin>>T;
while(T--)sol();
}
本文作者:xzhiflow
本文链接:https://www.cnblogs.com/Exotic-sum/p/18718971
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
信息学
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步