题意:

有N个学生。有M题目

然后相应N行分别有一个二进制和一个整数

二进制代表该同学给出的每道题的答案。整数代表该同学的答案与标准答案相符的个数

要求推断标准答案有几个,假设标准答案仅仅有一种。则输出标准答案



思路:

非常easy想到状态压缩。可是非常明显1<<30纯粹的状压是会超时的,那么我们能够优化一半,变成1<<15

也就是说,对于一个串,我们分半处理

首先处理前一半,讨论前一半与标准答案相符的状况。然后再讨论后半串,看与标准答案相符的情况能不能与前一半相匹配,从而算出答案



#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <bitset>
#include <algorithm>
#include <climits>
using namespace std; #define ls 2*i
#define rs 2*i+1
#define UP(i,x,y) for(i=x;i<=y;i++)
#define DOWN(i,x,y) for(i=x;i>=y;i--)
#define MEM(a,x) memset(a,x,sizeof(a))
#define W(a) while(a)
#define gcd(a,b) __gcd(a,b)
#define LL long long
#define ULL unsigned long long
#define N 100005
#define INF 0x3f3f3f3f
#define EXP 1e-8
#define rank rank1
const int mod = 1000000007; int t,n,m;
char str[50][50];
int a[50];
LL num[50][2];
int hsh[1<<16]= {0}; int main()
{
int i,j,k;
for(i = 0; i<(1<<16); i++)//hsh记录1的个数
{
t = i;
while(t)
{
hsh[i]+=t%2;
t/=2;
}
}
scanf("%d",&t);
while(t--)
{
LL ans = 0;
map<LL,int> cnt;
map<LL,int> state;
scanf("%d%d",&n,&m);
for(i = 0; i<n; i++)
{
scanf("%s%d",str[i],&a[i]);
num[i][0]=num[i][1] = 0;
for(j = 0; j<m/2; j++)//记录前一半的2进制状态
num[i][0] = num[i][0]*2+(str[i][j]-'0');
for(j = m/2; j<m; j++)//记录后一半的2进制状态
num[i][1] = num[i][1]*2+(str[i][j]-'0');
}
//前半部的处理
int s = m/2;
for(i = 0; i<(1<<s); i++)
{
LL tem = 0;
for(j = 0; j<n; j++)
{
k = hsh[i^num[j][0]];//与答案不同样的个数
if(s-k>a[j]) break;
tem = tem*30+s-k;//30进制存状态
}
if(j==n)
{
cnt[tem]++;//该状态有几种
state[tem] = i;
}
}
s = m-s;//后一半
int s1,s2;
for(i = 0; i<(1<<s); i++)
{
LL tem = 0;
for(j = 0; j<n; j++)
{
k = hsh[i^num[j][1]];
if(s-k>a[j]) break;
tem = tem*30+a[j]-(s-k);//找回前一半的状态
}
if(j==n&&cnt[tem])
{
ans+=cnt[tem];
s1 = state[tem];
s2 = i;
}
}
if(ans==1)
{
stack<int> Q;
for(i = 0; i<s; i++)
{
Q.push(s2%2);
s2/=2;
}
for(i = 0; i<m-s; i++)
{
Q.push(s1%2);
s1/=2;
}
while(!Q.empty())
{
printf("%d",Q.top());
Q.pop();
}
printf("\n");
}
else
printf("%d solutions\n",ans);
} return 0;
}

BAPC2014 K&amp;&amp;HUNNU11591:Key to Knowledge(中途相遇法)的更多相关文章

  1. K - 4 Values whose Sum is 0(中途相遇法)

    K - 4 Values whose Sum is 0 Crawling in process... Crawling failed Time Limit:9000MS     Memory Limi ...

  2. 【中途相遇法】【STL】BAPC2014 K Key to Knowledge (Codeforces GYM 100526)

    题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show& ...

  3. Java Map集合按照key和value排序之法

    一.理论基点 Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等. TreeMap:基于红黑树(Red-Black-Tre ...

  4. HDU 5936 Difference

    题意: 有一个函数f(y, k) = y的每个十进制位上的数字的k次幂之和 给x, k 求 有多少个y满足 x = f(y, k) - y 思路: (据说这叫中途相遇法?) 由于 x >= 0 ...

  5. NOIP2017 国庆郑州集训知识梳理汇总

    第一天 基础算法&&数学 day1难度测试 如果要用一个词来形容上午的测试,那真是体无完肤.  成绩: 题目 成绩 评价 T1 50 一般 T2 10 大失所望 T3 0 差 基础算法 ...

  6. NOIP2018提高组金牌训练营——搜索专题

    NOIP2018提高组金牌训练营——搜索专题 1416 两点 福克斯在玩一款手机解迷游戏,这个游戏叫做”两点”.基础级别的时候是在一个n×m单元上玩的.像这样: 每一个单元有包含一个有色点.我们将用不 ...

  7. uva 6757 Cup of Cowards(中途相遇法,貌似)

    uva 6757 Cup of CowardsCup of Cowards (CoC) is a role playing game that has 5 different characters (M ...

  8. hdu-5933----hdu-5943

    hdu-5933 思路: 贪心,首先要求总和是k的倍数,而又要求相邻,说明相邻的一块如果是sum/k的倍数,那么就地切割这样才能使操作数目最少; hdu-5934 思路: 强连通分量,可以找出强连通分 ...

  9. ACM 杂题,思路题 整理

    UVa 11572 - Unique Snowflakes 问一个数组中,无重复数字的最长子串长度是多少. 用map维护某数字上次出现的位置.另外用变量last表示上次出现数字重复的位置. 如果出现重 ...

随机推荐

  1. [CSS3] Image Width with sizes (srcset & sizes)

    What if the image won't be displayed at the full viewport width? Then you need something more than s ...

  2. Oracle 学习笔记 14 -- 集合操作和高级子查询

    Oracel提供了三种类型的集合操作:各自是并(UNION) .交(INTERSECT). 差(MINUS) UNION :将多个操作的结果合并到一个查询结果中,返回查询结果的并集,自己主动去掉反复的 ...

  3. mariadb克隆

    oracle有克隆安装,事实上mysql/mariadb相似.仅仅需简单几步就能够直接在异机直接启动. 环境: node01安装完毕的mariadb; node02一个新机器 如今将node01克隆到 ...

  4. bzoj4868: [Shoi2017]期末考试(三分法)

    4868: [Shoi2017]期末考试 题目:传送门 题解: Get到一个新姿势...三分法 一开始百度百科的时候下了一跳...中国...的根??? 学懂了之后其实运用起来就根二分差不多啊,不过证明 ...

  5. bzoj1045: [HAOI2008] 糖果传递(数论)

    1045: [HAOI2008] 糖果传递 题目:传送门(双倍经验3293) 题解: 一开始想着DP贪心一顿乱搞,结果就GG了 十分感谢hzwer大佬写的毒瘤数论题解: 首先,最终每个小朋友的糖果数量 ...

  6. nyoj--1058--部分和问题(dfs)

    部分和问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 给定整数a1.a2........an,判断是否可以从中选出若干数,使它们的和恰好为K. 输入 首先,n和k, ...

  7. Web开发中 前端路由 实现的几种方式和适用场景

    http://blog.csdn.net/xllily_11/article/details/51820909

  8. 模仿百度首页“元宵节汤圆”动图(js的定时任务:setInterval)

    模仿百度首页“元宵节汤圆”动图:(js的定时任务:setInterval) 原理:需要一张切图,通过不断定位使得图片就像一帧一帧的图片在播放从而形成了动画 效果图: 切图地址: https://ss1 ...

  9. python网页问题

    #django-admin不是个命令 添加环境变量 D:\Python36\Scripts #localhost加载失败 命令行 python manage.py runserver 0.0.0.0: ...

  10. IEEE Access的模板的问题

    这个模板果然问题还是有一些,比如caption换行得自己改class文件.首先感谢一下CSDN的一位网友的经验https://blog.csdn.net/baidu_21381705/article/ ...