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 ...
随机推荐
- 【JMeter】JMeter代码里若有外部自定义方法调用需要写进方法体里,否则报错
- OC学习9——反射机制
1.OC提供了3种编程方式与运行环境进行交互: 直接通过OC的源代码:这是最常见的方式,开发人员只是编写OC源代码,而运行环境负责在后台工作. 通过NSObject类中定义的方法进行动态编程:因为绝大 ...
- Swift3.0 UITextField
import UIKit private var textfieldd = UITextField() class TextFieldViewController: UIViewController, ...
- 谷歌浏览器插件-jsonView插件安装与使用
本文转载:http://www.bubuko.com/infodetail-700647.html 1 安装 1.打开 https://github.com : 2.搜索 jsonView 链接:ht ...
- Intellj Idea使用tomcat部署不成功,死活也找不到解决办法的看这里
Intellij 周六晚上开发一个简单web项目的,使用tomcat打包部署,死活也没法部署成功,和这个问题怼了6个小时,也没搞清楚具体为什么不能访问页面,但是好在最后还是找了个方法把问题解决了.以下 ...
- Structural Inference of Hierarchies in Networks(网络层次结构推断)
Structural Inference of Hierarchies in Networks(网络层次结构推断) 1. 问题 层次结构是一种重要的复杂网络性质.这篇文章给出了层次结构的精确定义,给出 ...
- [知了堂学习笔记]_用JS制作《飞机大作战》游戏_第4讲(创建敌方飞机、敌方飞机发射子弹、玩家子弹击中敌方小飞机,小飞机死亡)
一.创建敌方飞机 1.思考创建思路: 创建敌方飞机思路与创建玩家飞机思路一样: (1)思考敌方飞机具备什么属性: 敌方飞机的图片.坐标.飞行速度.状态(是否被击中) 设置小飞机被击中时消失时间.飞机可 ...
- java 修饰符之修饰范围
不同修饰符有不同修饰范围,为了对修饰符有更明确的认识,使用表格总结. 抽象\关键字 public protected private static final abstract default 类 √ ...
- Web API系列之一 Rest简介
1.REST:Representational State Transfer表征状态转移,是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格.REST设计风格有如下几点: ...
- 【简单理解】gulp和webpack的区别
Gulp和Webpack的基本区别: gulp可以进行js,html,css,img的压缩打包,是自动化构建工具,可以将多个js文件或是css压缩成一个文件,并且可以压缩为一行,以此来减少文件体积,加 ...