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 ...
随机推荐
- JDBC中rs.beforeFirst()
写在前面: 最近的项目比较老,用到了jdbc查询数据,展示数据.有时候一个查询语句的ResultSet需要用到好几次,即需要遍历好几次同一个查询结果集,那要怎么办呢? 使用如下方式即可解决 其实这里理 ...
- 初识Avro
Avro是Hadoop生态圈的一部分,由Hadoop的创始人Doug Cutting牵头开发,当前最新版本1.8.2.Avro是一个数据序列化系统,设计用于支持大批量数据交换的应用.它的主要特点有: ...
- mac配置java和maven环境变量
1.打开终端: 2.输入命令:sudo vi ~/.bash_profile进入编辑模式: 3.输入开机密码并按两次enter键进入编辑选择项: 4.输入i键进入文件插入模式输入配置信息: 5.按es ...
- python学习日记:day11-----装饰器
1,time模块 import time print(time.sleep())#让程序在执行到这个位置到时候停一会 print('哈哈哈') 获取当前时间 import time time.time ...
- 【Hdu2089】不要62(数位DP)
Description 题目大意:给定区间[n,m],求在n到m中没有"62"或"4"的数的个数. 如62315包含62,88914包含4,这两个数都是不合法的 ...
- Android Activity生命周期详细解析
概况 讲Android Activity那怎么都绕不过这张图,这篇文章也是围绕这幅图详细分析. 背景 假设这是你的APP,以此为背景,下面的每个part请结合上图理解. #Case 1 当按下app启 ...
- Pipeline in scala——给scala添加管道操作
linux系统中管道这一功能相信大家肯定使用过,比如现在想找到用户目录下文件名包含db的所有文件,ls ~的结果,作为grep db的参数: ➜ ~ ls ~ | grep db kv.mv.db ...
- Foreign websites
[社交] 1.Twitter. It's what's happening. 2.Telegram Messenger 3.Facebook - Log In or Sign Up 4.Instagr ...
- [置顶]
xamarin android 布局尺寸了解
为了使UI界面在不同大小的移动端显示器上能够正常显示,大家可能都知道使用sp作为字体大小的单位,dp作为其他元素长度的单位. 前几天看了一篇文章关于 App设计规范的,文章用心写的非常好,这里是链接 ...
- 2.Nginx日常维护技巧
Nginx日常维护技巧 Nginx配置正确性检查 nginx提供了配置文件调试功能,可以快速定义配置文件存在的问题.执行如下命令检测配置文件的正确性: [root@localhost 桌面]# whi ...