CF1101G & CF959F题解

做这两题之前要了解这个算法
我在这里也做了解释。

1101 G. (Zero XOR Subset)-less

如果一个数组[ a 1 , a 2 , a 3 . . . , a n a_1,a_2,a_3...,a_n a1,a2,a3...,an]的所有子集的异或和都 ≠ 0 \neq0 =0的话,则basis vectors的size=n。
这其实很好理解:如果basis vectors的size ≠ 0 \neq0 =0的话,那么有一些元素必然没有被加入也就是那些元素可以被已加入的元素"替代",那么这些替代它的元素 xor 那个没被加入的元素一定= 0。
好了,那么假设分段的右边界是[ r 1 , r 2 , r 3 . . . , r d − 1 , n r_1,r_2,r_3...,r_{d-1},n r1,r2,r3...,rd1,n],异或前缀和为[ p r e 1 , p r e 2 , . . . , p r e n pre_1,pre_2,...,pre_n pre1,pre2,...,pren]
basis vectors{ p r e r 1 , p r e r 1 ⊕ p r e r 2 , p r e r 2 ⊕ p r e r 3 . . . p r e r d − 1 ⊕ p r e n pre_{r_1},pre_{r_1} ⊕pre_{r_2},pre_{r_2} ⊕pre_{r_3}...pre_{r_{d-1}} ⊕pre_{n} prer1,prer1prer2,prer2prer3...prerd1pren}.size=d
那么basis vectors{ p r e r 1 , p r e r 2 p r e r 3 . . . p r e n pre_{r_1},pre_{r_2}pre_{r_3}...pre_{n} prer1,prer2prer3...pren}.size=d
可以这么理解:
p r e r x ⊕ p r e r y = ( ( p r e r x ⊕ p r e r x + 1 ) ⊕ ( p r e r x + 1 ⊕ p r e r x + 2 ) . . . ( p r e r y − 1 ⊕ p r e r y ) {\color{Blue} pre_{r_x} ⊕pre_{r_y}=((pre_{r_x}⊕pre_{r_{x+1}})⊕(pre_{r_{x+1}}⊕pre_{r_{x+2}})...(pre_{r_{y-1}}⊕pre_{r_{y}})} prerxprery=((prerxprerx+1)(prerx+1prerx+2)...(prery1prery)
如果
所以就把所有 p r e i pre_i prei加到basis vectors最终答案就是basis vectors.size.
其中: p r e n pre_n pren必须要加到basis vectors 中!否则答案为-1.
Code:

#include<bits/stdc++.h>
#define rb(a,b,c) for(int a=b;a<=c;++a)
#define rl(a,b,c) for(int a=b;a>=c;--a)
#define LL long long
#define IT iterator
#define PB push_back
#define II(a,b) make_pair(a,b)
#define FIR first
#define SEC second
#define FREO freopen("check.out","w",stdout)
#define rep(a,b) for(int a=0;a<b;++a)
#define KEEP while(1)
#define SRAND mt19937 rng(chrono::steady_clock::now().time_since_epoch().count())
#define random(a) rng()%a
#define ALL(a) a.begin(),a.end()
#define POB pop_back
#define ff fflush(stdout)
#define fastio ios::sync_with_stdio(false)
#define debug_pair(A) cerr<<A.FIR<<" "<<A.SEC<<endl;
using namespace std;
const int INF=0x3f3f3f3f;
typedef pair<int,int> mp;
typedef pair<mp,mp> superpair;
const int d=30;
int store[d];	
int main(){
	fastio;
	int n;
	cin>>n;
	int pref=0;
	rb(i,1,n){
		int ai;
		cin>>ai;
		pref^=ai;
		ai=pref;
		rep(j,d){
			if(store[j]&&(1&(ai>>j))){
				ai^=store[j];
			}
		}
		if(ai){
			rep(j,d){
				if(1&(ai>>j)){
					store[j]=ai;
					break;
				}
			}
		}
	}
	if(!pref){
		cout<<"-1"<<endl;
	}
	else{
		int ans=0;
		rep(i,d)
			ans+=bool(store[i]);
			cout<<ans<<endl;
	}
	return 0;
}

959 F. Mahmoud and Ehab and yet another xor task

总思路对于所有的位置i建立basis vectors
问题就转化为:

有一个数组[ a 1 , a 2 , a 3 . . . a n a_1,a_2,a_3...a_n a1,a2,a3...an],取出一些数其中他们xor起来=k,有多少种取法?

basis vectors 有一个特性如果一个数可以用basis vectors 里的数xor来表示的话,最多只有一种方法,因为 f ( x ) f(x) f(x)各不相同。
其中没有被加入到basis vectors 里的元素都可已被basis vectors 里的元素替代,也就只有一种替代方法。所以如果可以被表示,那么答案就是 2 没 被 加 入 到 b a s i s v e c t o r s 里 的 数 的 个 数 2^{没被加入到basis vectors里的数的个数} 2basisvectors,否则是0。
code:

#include<bits/stdc++.h>
#define rb(a,b,c) for(int a=b;a<=c;++a)
#define rl(a,b,c) for(int a=b;a>=c;--a)
#define LL long long
#define IT iterator
#define PB push_back
#define II(a,b) make_pair(a,b)
#define FIR first
#define SEC second
#define FREO freopen("check.out","w",stdout)
#define rep(a,b) for(int a=0;a<b;++a)
#define KEEP while(1)
#define SRAND mt19937 rng(chrono::steady_clock::now().time_since_epoch().count())
#define random(a) rng()%a
#define ALL(a) a.begin(),a.end()
#define POB pop_back
#define ff fflush(stdout)
#define fastio ios::sync_with_stdio(false)
#define debug_pair(A) cerr<<A.FIR<<" "<<A.SEC<<endl;
using namespace std;
const int INF=0x3f3f3f3f;
typedef pair<int,int> mp;
typedef pair<mp,mp> superpair;
const int d = 20;
int store[100000+1][d];
int n,q,a[100000+2];
LL pre[100000+2];
int main(){
	fastio;
	pre[0]=1;
	rb(i,1,100000)
		pre[i]=pre[i-1]<<1,pre[i]%=(LL)(1e9+7);
	cin>>n>>q;rb(i,1,n) cin>>a[i];
	rb(i,1,n){
	rep(j,d)
		store[i][j]=store[i-1][j];
	rep(j,d){
		if(store[i][j]&&(1&(a[i]>>(j)))){
			a[i]^=store[i][j];
		}
	}
	rep(j,d){
		if(1&(a[i]>>j)){
			store[i][j]=a[i];
			break;
		}
	}
	}	
	while(q--){
		int l,x;
		cin>>l>>x;
		rep(j,d){
			if(store[l][j]&&(1&(x>>j))){
				x^=store[l][j];
			}
		}
		if(x){
			cout<<0<<endl;
		}
		else{
			int sz=0;
			rep(j,d)
				sz+=bool(store[l][j]);
			sz=l-sz;
			cout<<pre[sz]<<endl;
		}
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 JavaScript 编写的记忆游戏(附源代码)   项目:JavaScript 记忆游戏(附源代码) 记忆检查游戏是一个使用 HTML5、CSS 和 JavaScript 开发的简单项目。这个游戏是关于测试你的短期 记忆技能。玩这个游戏 时,一系列图像会出现在一个盒子形状的区域中 。玩家必须找到两个相同的图像并单击它们以使它们消失。 如何运行游戏? 记忆游戏项目仅包含 HTML、CSS 和 JavaScript。谈到此游戏的功能,用户必须单击两个相同的图像才能使它们消失。 点击卡片或按下键盘键,通过 2 乘 2 旋转来重建鸟儿对,并发现隐藏在下面的图像! 如果翻开的牌面相同(一对),您就赢了,并且该对牌将从游戏中消失! 否则,卡片会自动翻面朝下,您需要重新尝试! 该游戏包含大量的 javascript 以确保游戏正常运行。 如何运行该项目? 要运行此游戏,您不需要任何类型的本地服务器,但需要浏览器。我们建议您使用现代浏览器,如 Google Chrome 和 Mozilla Firefox, 以获得更好、更优化的游戏体验。要玩游戏,首先,通过单击 memorygame-index.html 文件在浏览器中打开游戏。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。
使用 JavaScript 编写的 Squareshooter 游戏及其源代码   项目:使用 JavaScript 编写的 Squareshooter 游戏(附源代码) 这款游戏是双人游戏。这是一款使用 JavaScript 编写的射击游戏,带有门户和强化道具。在这里,每个玩家都必须控制方形盒子(作为射手)。这款射击游戏的主要目标是射击对手玩家以求生存。当它射击对手时,它会获得一分。 游戏制作 该游戏仅使用 HTML 和 JavaScript 开发。该游戏的 PC 控制也很简单。 对于玩家 1: T:朝你上次动作的方向射击 A:向左移动 D:向右移动 W:向上移动 S:向下移动 对于玩家2: L:朝你上次移动的方向射击 左箭头:向左移动 右箭头:向右移动 向上箭头:向上移动 向下箭头:向下移动 游戏会一直进行,直到您成功射击对手或对手射击您为止。游戏得分显示在顶部。所有游戏功能均由 JavaScript 设置,而布局和其他次要功能则由 HTML 设置。 如何运行该项目? 要运行此项目,您不需要任何类型的本地服务器,但需要浏览器。我们建议您使用现代浏览器,如 Google Chrome 和 Mozilla Firefox。要运行此游戏,首先,通过单击 index.html 文件在浏览器中打开项目。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值