题目

根据一些众所周知的结论,我们先跑一棵生成树出来,之后把所有简单环都搞出来,那么\(u\)到\(v\)的路径一定可以由树上的路径和一些简单环拼起来得到

把所有简单环都插到一个线性基里,之后dfs一下线性基求出这些环能拼出的异或和有哪些;

再求一下树上的异或前缀和,\(u\)到\(v\)的路径一定是\(pre_u\bigoplus pre_v\)再异或上一些环构成的

开两个桶,\(A[i]\)表示前缀异或和为\(i\)的点得个数,\(B[i]\)表示\(i\)是否能被线性基凑出来,于是答案就是\(A\times A\times B\),自然是异或卷积,于是大力fwt就好了

代码

#include<bits/stdc++.h>
#define re register
#define LL long long
inline int read() {
char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
const int maxn=1e5+5;
const int len=262144;
struct E{int v,nxt,w;}e[maxn<<1];
int fa[maxn],n,m,q,head[maxn],num,vis[maxn],u[maxn*3],v[maxn*3],va[maxn*3],pre[maxn],M;
int lb[18];LL tax[len],tmp[len];
inline int find(int x) {return fa[x]==x?x:fa[x]=find(fa[x]);}
inline void add(int x,int y,int w) {
e[++num].v=y;e[num].nxt=head[x];head[x]=num;e[num].w=w;
}
void dfs(int x) {
vis[x]=1;
for(re int i=head[x];i;i=e[i].nxt) {
if(vis[e[i].v]) continue;
pre[e[i].v]=pre[x]^e[i].w;
dfs(e[i].v);
}
}
inline void ins(int x) {
for(re int i=17;i>=0;--i)
if(x>>i&1) {
if(!lb[i]) {lb[i]=x;return;}
x^=lb[i];
}
}
void Dfs(int bit,int nw) {
if(bit==-1) {
tmp[nw]=1;return;
}
Dfs(bit-1,nw);
if(lb[bit]) Dfs(bit-1,nw^lb[bit]);
}
inline void Fwt(LL *f,int o) {
for(re int i=2;i<=len;i<<=1)
for(re int ln=i>>1,l=0;l<len;l+=i)
for(re int x=l;x<l+ln;++x) {
LL g=f[x],h=f[x+ln];
f[x]=g+h,f[x+ln]=g-h;
if(o==-1) f[x]>>=1ll,f[x+ln]>>=1ll;
}
}
int main() {
n=read(),m=read(),q=read();
for(re int i=1;i<=n;i++) fa[i]=i;
for(re int x,y,w,i=1;i<=m;i++) {
x=read(),y=read(),w=read();
int xx=find(x),yy=find(y);
if(xx==yy) {u[++M]=x,v[M]=y,va[M]=w;continue;}
fa[xx]=yy,add(x,y,w),add(y,x,w);
}
for(re int i=1;i<=n;i++) if(!vis[i]) dfs(i);
for(re int i=1;i<=M;i++) ins(pre[u[i]]^pre[v[i]]^va[i]);
for(re int i=1;i<=n;i++) tax[pre[i]]++;
Dfs(17,0);Fwt(tax,1),Fwt(tmp,1);
for(re int i=0;i<len;i++) tax[i]=tax[i]*tax[i]*tmp[i];
Fwt(tax,-1);
for(re int x;q;--q) printf("%lld\n",tax[x=read()]);
return 0;
}

lg5169 xtq的异或和的更多相关文章

  1. [洛谷P5169]xtq的异或和

    题目大意:给你一张$n(n\leqslant10^5)$个点$m(m\leqslant3\times10^5)$条边的无向图,每条边有一个权值,$q(q\leqslant2^{18})$次询问,每次询 ...

  2. P5169 xtq的异或和(FWT+线性基)

    传送门 我咋感觉我学啥都是白学-- 首先可以参考一下这一题,从中我们可以知道只要知道两点间任意一条路径以及整个图里所有环的线性基,就可以得知这两个点之间的所有路径的异或和 然而我好像并不会求线性基能张 ...

  3. Android数据加密之异或加密算法

    前言: 这几天被公司临时拉到去做Android IM即时通信协议实现,大致看了下他们定的协议,由于之前没有参与,据说因服务器性能限制,只达成非明文传递,具体原因我不太清楚,不过这里用的加密方式是采用异 ...

  4. Oracle数据库异机升级

    环境: A机:RHEL5.5 + Oracle 10.2.0.4 B机:RHEL5.5 需求: A机10.2.0.4数据库,在B机升级到11.2.0.4,应用最新PSU补丁程序. 目录: 一. 确认是 ...

  5. [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字

    Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum re ...

  6. [PHP][位转换积累]之异或运算的简单加密应用

    异或的符号是^.按位异或运算, 对等长二进制模式按位或二进制数的每一位执行逻辑按位异或操作. 操作的结果是如果某位不同则该位为1, 否则该位为0. xor运算的逆运算是它本身,也就是说两次异或同一个数 ...

  7. Poj The xor-longest Path 经典题 Trie求n个数中任意两个异或最大值

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5646   Accepted: 1226 Description In an ...

  8. RMAN异机恢复遭遇ORA-01547、ORA-01152、ORA-01110错误案例

    测试环境:     操作系统  :  Red Hat Enterprise Linux ES release 4 (Nahant Update 4)   VMWARE     数据库     :  O ...

  9. RAC异机恢复

    RAC异机恢复PDCL到PFCL: PNCL:RAC+ASM ,product env   db name:PNCL   instance:PDCL1 PDCL2 PFCL:RAC+ASM ,perf ...

随机推荐

  1. 为什么要使用MQ和到底什么时候要使用MQ

      一.缘起 一切脱离业务的架构设计与新技术引入都是耍流氓. 引入一个技术之前,首先应该解答的问题是,这个技术解决什么问题. 就像微服务分层架构之前,应该首先回答,为什么要引入微服务,微服务究竟解决什 ...

  2. 阮一峰 ES6

    阮一峰 ES6:http://es6.ruanyifeng.com/#docs/module

  3. Logback配置,error和普通日志分离

    <?xml version="1.0" encoding="utf-8"?> <configuration> <springPro ...

  4. 简易的富文本编辑器WangEditor

    网址http://www.wangeditor.com/ var E = window.wangEditor; var editor = new E('#editor') // 或者 var edit ...

  5. 2018-8-10-win10-uwp-httpClient-登陆CSDN

    title author date CreateTime categories win10 uwp httpClient 登陆CSDN lindexi 2018-08-10 19:16:53 +080 ...

  6. 循环结构select 举例

  7. Linux: 给右键菜单加一个“转换图片为jpg格式”

    Linux上通常都会安装imagemagick这个小巧但又异常强大的工具.这个软件提供了一系列很好用的功能.这里说一说如何使用它的convert命令转换图片为jpg格式,以及如何把它添加到Thunar ...

  8. C++判断字符是否是元音字母

    写这个随笔的起因很奇怪. 我本来想找找C++有没有内置的函数(类似isalpha(), isdigit(), isalnum()之流)能直接完成这个功能,但是函数没发现,却发现很多博客都是逐个字符判断 ...

  9. 联想think system sr550信息

    带外管理口 默认IP地址:192.168.70.125 默认用户名密码 USERID PASSW0RD    0是数字0

  10. ubuntu下oracle 数据库安装

    环境:腾讯云 一. 由于腾讯云直接下载oracle太慢,先安装docker 1.sudo apt update 2.接下来,使用apt安装一些允许通过HTTPS才能使用的软件包: sudo apt i ...