首页 > 其他分享 >异或的常用性质

异或的常用性质

时间:2024-08-21 19:15:30浏览次数:14  
标签:常用 ch int tot 异或 Crying dis 性质

性质

1.

百度百科给的

最主要的性质就是归零和结合,其他的就都是拓展了。
例题:P1469

2.

\(a \bigoplus b<=a+b\)

关于这个不等式比较好的理解为异或就是不进位的加法
例题:luoguP5514

应用

异或哈希

异或跟hash一样,也是会发生冲突的
例如:$1 \bigoplus 2 = 5 \bigoplus 6 $
那我们要怎么去避免冲突呢,我们就可以借助hash的思想,对异或值做一个映射,或基于一个base来达成。

来看这道题,我们先来分析Crying的必胜策略:
假设Crying首先拿最小的数,如果最小的数有奇数个,那Crying会赢,如果为偶数个,那Crying肯定不会上来就拿最小的数,而是先去考虑拿第二小的数,那同样如果第二小的数为奇数个,Crying胜,如果为偶数个,那就接着考虑第三小的数,以此类推……
那转化一下题意就是求保证路径上每个数字不会出现偶数次的路径,再转化一下那这就是要保证路径的异或和不为 \(0\) (异或的归零性质,相同的数两两相抵消)。
但是,这样就会出现一个问题:异或冲突
我们就可以用上面的方法来避免这个问题,那这题就好办了,我们加边的时候给边权乘一个base,然后dfs跑一遍每个点到根节点的异或和,最后统计一下。这个时间限制不支持\(O(n^2)\)的操作,我们就可以开个map存一下dis相同的个数,最后减去即可。
点击查看代码
#include<bits/stdc++.h>
using namespace std;

#define int long long
const int N=5e6+107;
int n;

int read()
{
	int f=1,s=0;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){s=(s<<1)+(s<<3)+(ch^48);ch=getchar();}
	return f*s;
}

unsigned long long qpow(unsigned long long a,int b)
{
	unsigned long long ans=1;
	while(b)
	{
		if(b&1) ans=ans*a;
		a=a*a;
		b=b>>1;
	}
	return ans;
}

int h[N],to[N],nxt[N],w[N],tot;
void add(int x,int y,int dt)
{
	to[++tot]=y;
	nxt[tot]=h[x];
	w[tot]=dt;
	h[x]=tot;
}
unordered_map<int,int>mp,vis;

int dis[N];
void dfs(int u,int fa)
{
	for(int i=h[u];i;i=nxt[i])
	{
		int v=to[i];
		if(v==fa) continue;
		dis[v]=dis[u]^w[i];
		dfs(v,u);
	}
	mp[dis[u]]++;
}

void clear()
{
	memset(h,0,sizeof h);
	mp.clear(); vis.clear();
	tot=0;
}

signed main()
{
	int T=read();
	while(T--)
	{
		clear();
		n=read();
		for(int i=1;i<=n-1;i++)
		{
			int x=read(),y=read(),dt=qpow(237,read()+1);
			add(x,y,dt); add(y,x,dt);
		}
		dfs(1,0);
		int ans=n*(n-1)/2;
		for(int i=1;i<=n;i++)
		{
			if(vis[dis[i]]) continue;
			ans-=mp[dis[i]]*(mp[dis[i]]-1)/2;
			vis[dis[i]]=1;
		}
		printf("%lld\n",ans);
	}
}

标签:常用,ch,int,tot,异或,Crying,dis,性质
From: https://www.cnblogs.com/zhengchenxi/p/18357003

相关文章

  • Conda 常用指令
    Conda是一个开源的软件包管理和环境管理系统,其主要特点有:跨平台:支持Windows、macOS和Linux。环境管理:可以创建、导出、列出、删除和更新环境。包管理:安装、更新和管理软件包。支持多种编程语言:不仅限于Python,还支持R、Ruby、Lua、Scala、Java等。参考:Conda指令文......
  • 常用代码/工具放置
    \({\mathtt{1}}\).gcd(最大公因数)点击查看代码llgcd(lla,llb){ if(b==0)returna; returngcd(b,a%b);}\({\mathtt{2}}\).链式前向星点击查看代码inthead[100005],edgenum;structedge{intnext;intto;intw;};edgeedge[MAXN];voidadd......
  • 两幅图像间的逻辑操作,与、或、非、异或:bitwise_and( ) bitwise_or( ) bitwise_not( )
    学OpenCV===============================================================================================这里额外看了下使用mask的情形 ===============================================================================================代码1#include<iostre......
  • 线程常用api
    线程常用apipthread_create该api用于创建一个新线程intpthread_create(pthread_t*thread,constpthread_attr_t*attr,void*(*start_routine)(void*),void*arg)pthread_t*thread:指向线程标识符的指针,用于存储新创建的线程的线程标识符constpthread_attr_t*attr:用来......
  • 打开cmd的方式及常用的dos命令
    系统快捷键ctrl加shift:切换大小写Ctrl加z:撤销Ctrl加x:剪切Ctrl加c:复制Ctrl加v:粘贴Alt加F4:关闭窗口shift加delete:永久删除windows加r:输入cmd,打开命令提示符windows加E:打开E盘打开任务管理器——右键任务栏——任务管理器——如果电脑发生死机——结束资源管理器——右键......
  • Windows 隐蔽 DNS 隧道是一种利用 DNS 协议在网络上进行隐蔽数据传输的技术。DNS(域名
    Windows隐蔽DNS隧道是一种利用DNS协议在网络上进行隐蔽数据传输的技术。DNS(域名系统)通常用于将域名解析为IP地址,但其协议本身并不限制传输的数据内容。因此,攻击者或信息安全专家可能利用这一点,通过DNS请求和响应传输未经授权的数据流量。工作原理数据编码:首先,将要传......
  • 常用类总结
    一、Object类概述及其构造方法1.Object类概述类层次结构的根类。所有类都直接或者间接的继承自该类。构造方法publicObject()子类的构造方法默认访问的是父类的无参构造方法。1)Object类的成员方法publicinthashCode():这个方法返回对象的哈希码值,通常用于哈希表(如Hash......
  • 简鹿办公汇总六款常用视频压缩软件及介绍
    随着高清视频的普及,视频文件的体积也越来越大,这给存储和传输带来了挑战。为了节省空间和提高传输效率,视频压缩成为了一项重要的技术。本文简鹿办公将介绍六款常用的视频压缩软件,帮助您更好地管理视频文件。1. HandBrakeHandBrake 是一款开源的视频转码工具,支持多种输入和输......
  • (转)高效率运维K8s 这些常用命令你得会
    原文:https://blog.csdn.net/qq_42568611/article/details/131219853高效率运维K8s这些常用命令你得会❝日常K8s运维工作中难免会连接K8s集群哐哐哐的输出命令来进行Kubernetes应用运维工作。今天就总结一些常用的kubectl命令及应用调试技巧。以便于日常查阅或提高效率!❞基本操......
  • 记录常用的一些样式
    //页面外层style.mPagewidth:100%height:100%font-size:28rpxbackground-color:#f7f7f7/*水平排列*/.x-rowdisplay:flexflex-direction:rowalign-items:center/*水平排列居中*/.x-row-centerdisplay:flex......