FWT模板
代码来自51nod1570
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MN 501
using namespace std; int read_p,read_ca;
inline int read(){
read_p=;read_ca=getchar();
while(read_ca<''||read_ca>'') read_ca=getchar();
while(read_ca>=''&&read_ca<='') read_p=read_p*+read_ca-,read_ca=getchar();
return read_p;
}
const int MOD=1e9+,N2=(MOD+)/;
int n,m,MMH=,Mavis=,_Mavis=,mmh[MN][(<<)+],ro,num=,a[(<<)+],b[(<<)+];
char s[MN];
inline void M(int &x){while(x>=MOD)x-=MOD;while(x<)x+=MOD;}
void work(int p,bool b,int mmh[]){
int s=;
for (int i=;i<;i++) s|=(((i>>p)&)^b)<<i;
mmh[s]++;
}
inline void FWT_x(int N,int a[]){
for (int i=;i<=N;i<<=)
for (int m=i>>,j=;j<N;j+=i)
for (int k=;k<m;k++) M(a[j+k]+=a[j+k+m]),M(a[j+k+m]=a[j+k]-*a[j+k+m]);
}
inline void IFWT_x(int N,int a[]){
for (int i=;i<=N;i<<=)
for (int m=i>>,j=;j<N;j+=i)
for (int k=;k<m;k++){
int A=a[j+k],B=a[j+k+m];
a[j+k]=1LL*(A+B)*N2%MOD;
a[j+k+m]=1LL*(A+MOD-B)*N2%MOD;
}
}
inline void FWT_a(int N,int a[]){
for (int i=;i<=N;i<<=)
for (int m=i>>,j=;j<N;j+=i)
for (int k=;k<m;k++) M(a[j+k]+=a[j+k+m]);
}
inline void IFWT_a(int N,int a[]){
for (int i=;i<=N;i<<=)
for (int m=i>>,j=;j<N;j+=i)
for (int k=;k<m;k++) M(a[j+k]-=a[j+k+m]);
}
inline void FWT_o(int N,int a[]){
for (int i=;i<=N;i<<=)
for (int m=i>>,j=;j<N;j+=i)
for (int k=;k<m;k++) M(a[j+k+m]+=a[j+k]);
}
inline void IFWT_o(int N,int a[]){
for (int i=;i<=N;i<<=)
for (int m=i>>,j=;j<N;j+=i)
for (int k=;k<m;k++) M(a[j+k+m]-=a[j+k]);
}
void hb(int A[],int B[],int mmh[],bool kind){
for (int i=;i<(<<);i++) a[i]=A[i],b[i]=B[i];
if (kind){
FWT_o(<<,a);FWT_o(<<,b);
for (int i=;i<(<<);i++) a[i]=1LL*a[i]*b[i]%MOD;
IFWT_o(<<,a);
for (int i=;i<(<<);i++) M(mmh[i]+=a[i]);
}else{
FWT_a(<<,a);FWT_a(<<,b);
for (int i=;i<(<<);i++) a[i]=1LL*a[i]*b[i]%MOD;
IFWT_a(<<,a);
for (int i=;i<(<<);i++) M(mmh[i]+=a[i]);
}
}
int work(int l,int r){
int p=++num,i,j;
if (l==r){
if (s[l]=='?') for (i=;i<;i++) work(i,,mmh[p]),work(i,,mmh[p]);else
if (s[l]=='A') work(,,mmh[p]);else
if (s[l]=='a') work(,,mmh[p]);else
if (s[l]=='B') work(,,mmh[p]);else
if (s[l]=='b') work(,,mmh[p]);else
if (s[l]=='C') work(,,mmh[p]);else
if (s[l]=='c') work(,,mmh[p]);else
if (s[l]=='D') work(,,mmh[p]);else
if (s[l]=='d') work(,,mmh[p]);
}else{
for (i=l,j=;;i++)
if (j+=s[i]=='(',j-=s[i]==')',!j) break;
i++;
int L=work(l+,i-),R=work(i+,r-);
if (s[i]=='&') hb(mmh[L],mmh[R],mmh[p],);else
if (s[i]=='|') hb(mmh[L],mmh[R],mmh[p],);else
hb(mmh[L],mmh[R],mmh[p],),hb(mmh[L],mmh[R],mmh[p],);
}
return p;
}
int main(){
scanf("%s",s);
ro=work(,strlen(s)-);
n=read();
for (int i=;i<=n;i++){
int a=;
a|=read();a|=read()<<;a|=read()<<;a|=read()<<;
MMH|=<<a;Mavis|=read()<<a;
}
for (int i=;i<(<<);i++)
if (!((i^Mavis)&MMH)) (_Mavis+=mmh[ro][i])%=MOD;
printf("%d\n",_Mavis);
}
FWT模板的更多相关文章
- 【洛谷4717】【模板】快速沃尔什变换(FWT模板)
点此看题面 大致题意: 有两个长度为\(2^n\)的数组\(A,B\),且\(C_i=\sum_{j⊕k==i}A_jB_k\)分别求出当\(⊕\)为\(or,and,xor\)时的\(C\)数组. ...
- FWT模板(洛谷P4717 【模板】快速沃尔什变换)(FWT)
洛谷题目传送门 只是一个经过了蛇皮压行的模板... 总结?%%%yyb%%% #include<bits/stdc++.h> #define LL long long #define RG ...
- P4717 快速沃尔什变换FWT 模板题
#include <bits/stdc++.h> using namespace std; #define rep(i,a,n) for (int i=a;i<n;i++) #def ...
- CSU1911 Card Game 【FWT】
题目链接 CSU1911 题解 FWT模板题 #include<algorithm> #include<iostream> #include<cstdlib> #i ...
- BZOJ4589 Hard Nim 【FWT】
题目链接 BZOJ4589 题解 FWT 模板题 #include<algorithm> #include<iostream> #include<cstdlib> ...
- $FFT/NTT/FWT$题单&简要题解
打算写一个多项式总结. 虽然自己菜得太真实了. 好像四级标题太小了,下次写博客的时候再考虑一下. 模板 \(FFT\)模板 #include <iostream> #include < ...
- 题解-Little C Loves 3 III
Little C Loves 3 III 给定 \(n\) 和序列 \(a_0,a_1,\dots,a_{2^n-1}\) 和 \(b_0,b_1,\dots,b_{2^n-1}\),求序列 \(c_ ...
- 【模板/经典题型】FWT
FWT在三种位运算下都满足FWT(a×b)=FWT(a)*FWT(b) 其中or卷积和and卷积还可以通过FMT实现(本质上就是个高维前缀和) #include<bits/stdc++.h> ...
- Luogu4717 【模板】快速沃尔什变换(FWT)
https://www.cnblogs.com/RabbitHu/p/9182047.html 完全没有学证明的欲望因为这个实在太好写了而且FFT就算学过也忘得差不多了只会写板子 #include&l ...
随机推荐
- JS中数组的迭代方法和归并方法
昨天总结的JavaScript中的数组Array方法 数组的迭代方法 ES5中为数组定义了5个迭代方法.每个方法都要接收两个参数:要在每一项上面运行的函数和(可选的)运行该函数的作用域对象---影响t ...
- 浅谈Unix I/O模型
关于I/O模型的文章比较多,参考多篇后理解上仍然不太满意,终需自己整理一次,也是编写高吞吐量高性能网络接口模块的基础.这里所说的主要针对网络I/O,近几年面对越来越大的用户请求量,如何优化这些步骤直接 ...
- OC学习6——面相对象的三大特性
我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这也是面向对象的三大特征.OC学习篇之---类的三大特性(封装,继承,多态) 1.封装(Encapsulation)是指将对象的状态信息 ...
- AVL树的单双旋转操作
把必须重新平衡的节点称为å.对于二叉树,å的两棵子树的高度最多相差2,这种不平衡可能有四种情况: 对å的左儿子的左子树进行插入节点(左-左) 对å的左儿子的右子树进行插入节点(左-右) 对å的右儿子的 ...
- HNOI 2012 矿场搭建
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #def ...
- canvas学习api
1.canvas.getContext():获取渲染上下文和绘画功能: 一.绘制矩形 2.ctx.fillRect(x,y,width,height):绘制矩形: 3.ctx.strokeRect(x ...
- find 命令详解
find 作用:用于在文件树种查找文件,并作出相应的处理 (硬盘) 格式:find pathname -options [-print -exec -ok ...] 格式参数:pathname: fi ...
- package-cleanup
package-cleanup 是一个python开发的命令程序,用来清除本机已安装的.重复的 或孤立的软件包. desktop版的CentOS镜像包含这个工具,而Minimal版的CentOS镜像不 ...
- Chrome headless 模式
我们在通过Selenium运行自动化测试时,必须要启动浏览器,浏览器的启动与关闭必然会影响执行效率,而且还会干扰你做其它事情(本机运行的话). 那能不能把自动化测试的运行放在后台?当然可以! html ...
- Generation Axe 吉他之夜音乐会-广州站 感受
本人第一次看音乐会,演唱会跟音乐会是有区别的哈,演唱会以表演.舞蹈.歌唱为主,还有很多特别嘉宾 演出时间: 从20点开始一直到23点多才结束,有五个吉他手,开场跟结束五个吉他手一齐演出.平均每个人表演 ...