CodeForces - 1017D Round #502 D. The Wu(状压预处理)
2 seconds
256 megabytes
standard input
standard output
Childan is making up a legendary story and trying to sell his forgery — a necklace with a strong sense of "Wu" to the Kasouras. But Mr. Kasoura is challenging the truth of Childan's story. So he is going to ask a few questions about Childan's so-called "personal treasure" necklace.
This "personal treasure" is a multiset SS of mm "01-strings".
A "01-string" is a string that contains nn characters "0" and "1". For example, if n=4n=4, strings "0110", "0000", and "1110" are "01-strings", but "00110" (there are 55 characters, not 44) and "zero" (unallowed characters) are not.
Note that the multiset SS can contain equal elements.
Frequently, Mr. Kasoura will provide a "01-string" tt and ask Childan how many strings ss are in the multiset SS such that the "Wu" value of the pair (s,t)(s,t) is not greater than kk.
Mrs. Kasoura and Mr. Kasoura think that if si=tisi=ti (1≤i≤n1≤i≤n) then the "Wu" value of the character pair equals to wiwi, otherwise 00. The "Wu" value of the "01-string" pair is the sum of the "Wu" values of every character pair. Note that the length of every "01-string" is equal to nn.
For example, if w=[4,5,3,6]w=[4,5,3,6], "Wu" of ("1001", "1100") is 77 because these strings have equal characters only on the first and third positions, so w1+w3=4+3=7w1+w3=4+3=7.
You need to help Childan to answer Mr. Kasoura's queries. That is to find the number of strings in the multiset SS such that the "Wu" value of the pair is not greater than kk.
The first line contains three integers nn, mm, and qq (1≤n≤121≤n≤12, 1≤q,m≤5⋅1051≤q,m≤5⋅105) — the length of the "01-strings", the size of the multiset SS, and the number of queries.
The second line contains nn integers w1,w2,…,wnw1,w2,…,wn (0≤wi≤1000≤wi≤100) — the value of the ii-th caracter.
Each of the next mm lines contains the "01-string" ss of length nn — the string in the multiset SS.
Each of the next qq lines contains the "01-string" tt of length nn and integer kk (0≤k≤1000≤k≤100) — the query.
For each query, print the answer for this query.
2 4 5
40 20
01
01
10
11
00 20
00 40
11 20
11 40
11 60
2
4
2
3
4
1 2 4
100
0
1
0 0
0 100
1 0
1 100
1
2
1
2
In the first example, we can get:
"Wu" of ("01", "00") is 4040.
"Wu" of ("10", "00") is 2020.
"Wu" of ("11", "00") is 00.
"Wu" of ("01", "11") is 2020.
"Wu" of ("10", "11") is 4040.
"Wu" of ("11", "11") is 6060.
In the first query, pairs ("11", "00") and ("10", "00") satisfy the condition since their "Wu" is not greater than 2020.
In the second query, all strings satisfy the condition.
In the third query, pairs ("01", "11") and ("01", "11") satisfy the condition. Note that since there are two "01" strings in the multiset, the answer is 22, not 11.
In the fourth query, since kk was increased, pair ("10", "11") satisfies the condition too.
In the fifth query, since kk was increased, pair ("11", "11") satisfies the condition too.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define MAX 500005
#define INF 0x3f3f3f3f
#define MOD 1000000007
using namespace std;
typedef long long ll; int a[MAX];
char s[MAX][];
char ss[];
ll dp[(<<)+][];
int b[(<<)+]; int main()
{
int n,m,q,x,i,j,k;
scanf("%d%d%d",&n,&m,&q);
for(i=;i<n;i++){
scanf("%d",&a[i]);
}
for(i=;i<m;i++){
scanf(" %s",s[i]);
}
for(i=;i<m;i++){
ll S=;
for(j=;j<n;j++){
if(s[i][j]=='') S|=<<j;
}
b[S]++;
}
for(i=;i<(<<n);i++){
for(j=;j<(<<n);j++){
if(!b[j]) continue;
int sum=;
for(k=;k<n;k++){
if((i&(<<k))==(j&(<<k))) sum+=a[k];
}
if(sum>) continue;
dp[i][sum]+=b[j];
}
} while(q--){
scanf(" %s %d",ss,&x);
ll S=;
for(i=;i<n;i++){
if(ss[i]=='') S|=<<i;
}
ll ans=;
for(i=;i<=x;i++){
ans+=dp[S][i];
}
printf("%I64d\n",ans);
}
return ;
}
CodeForces - 1017D Round #502 D. The Wu(状压预处理)的更多相关文章
- Codeforces Round #384 (Div. 2) //复习状压... 罚时爆炸 BOOM _DONE
不想欠题了..... 多打打CF才知道自己智商不足啊... A. Vladik and flights 给你一个01串 相同之间随便飞 没有费用 不同的飞需要费用为 abs i-j 真是题意杀啊, ...
- Codeforces Gym 100610 Problem K. Kitchen Robot 状压DP
Problem K. Kitchen Robot Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10061 ...
- Codeforces 1225G - To Make 1(bitset+状压 dp+找性质)
Codeforces 题目传送门 & 洛谷题目传送门 还是做题做太少了啊--碰到这种题一点感觉都没有-- 首先我们来证明一件事情,那就是存在一种合并方式 \(\Leftrightarrow\) ...
- Codeforces Testing Round #12 C. Subsequences 树状数组维护DP
C. Subsequences Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/597/probl ...
- Codeforces Testing Round #12 C. Subsequences 树状数组
C. Subsequences For the given sequence with n different elements find the number of increasing s ...
- bestcoder Round#52 1001(最短路+状压dp)
求从1点出发,走遍所有的点,然后回到1点的最小代价. 每个点可以走若干遍. 如果每个点只能走一遍,那么设dp[i][s]为走完s状态个点(s是状态压缩),现在位于i的最小花费. 然后枚举从哪个点回到原 ...
- Codeforces 279D The Minimum Number of Variables 状压dp
The Minimum Number of Variables 我们定义dp[ i ][ mask ]表示是否存在 处理完前 i 个a, b中存者 a存在的状态是mask 的情况. 然后用sosdp处 ...
- codeforces#580 D. Kefa and Dishes(状压dp)
题意:有n个菜,每个菜有个兴奋值,并且如果吃饭第i个菜立即吃第j个菜,那么兴奋值加ma[i][j],求吃m个菜的最大兴奋值,(n<=18) 分析:定义dp[status][last],statu ...
- [多校联考2019(Round 5 T1)] [ATCoder3912]Xor Tree(状压dp)
[多校联考2019(Round 5)] [ATCoder3912]Xor Tree(状压dp) 题面 给出一棵n个点的树,每条边有边权v,每次操作选中两个点,将这两个点之间的路径上的边权全部异或某个值 ...
随机推荐
- js 获取地理位置经纬度
1. 加载百度API的核心js,ak表示获取百度地图的开发密钥,免费的需要申请下 <script type="text/javascript" src="http: ...
- 2017-2018-1 20179209《Linux内核原理与分析》第七周作业
一.实验 1.1task_struct数据结构 Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息.它定义在linux-3.18.6 ...
- 流畅python学习笔记第十八章:使用asyncio编写服务器
在这一章中,将使用asyncio写一个TCP服务器.这个服务器的作用是通过规范名称查找Unicode字符,来看下代码: import asyncio from charfinder import Un ...
- 【linux】crontab的环境变量问题
今天遇到一个奇怪的问题,同样一个脚本,手动执行没问题,加入到crontab中,就出现无法运行的情况,第一反应是环境变量问题 环境说明: 操作系统:centos 用户:test用户通过sudo su切换 ...
- 剑指Offer:二叉搜索树的后序遍历序列【33】
剑指Offer:二叉搜索树的后序遍历序列[33] 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. ...
- map select reduce
map: 针对每个element进行变换并返回整个修改后的map a.map do |item| a.upcase end a.map(&:upcase) 一样的效果, &:代表了it ...
- Ruby 文件 FILE
FileUtils.makedirs(LOCAL_DIR) unless File.exists?LOCAL_DIR require 'fileutils' Dir.mkdir(DATA_DIR) u ...
- 《高性能Javascript》 Summary(一)
第一章.加载和执行 Loading & Execution 原因:Javascript 的执行导致页面渲染中止等待. 解决: 将script放在页面底部,紧靠body 闭合标签之前,保证页面在 ...
- html5--1.16 内联框架
html5--1.16 内联框架 学习要点: 1.iframe内联框架2.综合实例1 1.iframe内联框架 1.iframe元素用来在文档中添加一个内联框架. 2.iframe为body元素的子元 ...
- linux C++ scandir 的使用
() 头文件 #include <dirent.h> () 函数定义 int scandir(const char *dir,struct dirent **namelist,int (* ...