告别是为延续回忆永恒的华丽。|

xzhiflow

园龄:1年11个月粉丝:1关注:2

CF2667F - Bitwise Slides

题面

  • pi=j=1iaj,那么由题意,进行 i 次操作后,有 PQR=pi

  • 因为 P,Q,R 这三个数字必须不成对地不同,所以这三个数字中必有一个为 pi,因为另外两个相同的数异或为 0。

  • 考虑状态,对于 fi,x,其三元组状态包括 (pi,x,x),(x,pi,x),(x,x,pi)

  • 考虑转移:

对于 fi1,x,可以转移到fi,x,因为 pi1ai=pi,可以操作等于 pi1 的那个值,共一个。
对于 fi1,pi 可以 ×2 转移到fi,pi1,因为 piai=pi1,可以操作等于 pi 的那个值,共两个。
对于 fi1,pi1 可以 ×3 转移到fi,pi1,因为 pi1ai=pi,可以操作等于 pi1 的那个值,共三个,此时不需要考虑第一种转移方案,这已经包含了那种情况。
  • 直接 dp 会爆空间,发现实际有用状态很小,实际只有 Spi,转移除了 fi,pi1 都可以直接沿用上一次的状态,所以可以压维并离散化状态来减小空间。

#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 中国大陆许可协议进行许可。

posted @   xzhiflow  阅读(5)  评论(1编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起