BAPC2014 K&&HUNNU11591:Key to Knowledge(中途相遇法)
题意:
有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&&HUNNU11591:Key to Knowledge(中途相遇法)的更多相关文章
- K - 4 Values whose Sum is 0(中途相遇法)
K - 4 Values whose Sum is 0 Crawling in process... Crawling failed Time Limit:9000MS Memory Limi ...
- 【中途相遇法】【STL】BAPC2014 K Key to Knowledge (Codeforces GYM 100526)
题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show& ...
- Java Map集合按照key和value排序之法
一.理论基点 Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等. TreeMap:基于红黑树(Red-Black-Tre ...
- HDU 5936 Difference
题意: 有一个函数f(y, k) = y的每个十进制位上的数字的k次幂之和 给x, k 求 有多少个y满足 x = f(y, k) - y 思路: (据说这叫中途相遇法?) 由于 x >= 0 ...
- NOIP2017 国庆郑州集训知识梳理汇总
第一天 基础算法&&数学 day1难度测试 如果要用一个词来形容上午的测试,那真是体无完肤. 成绩: 题目 成绩 评价 T1 50 一般 T2 10 大失所望 T3 0 差 基础算法 ...
- NOIP2018提高组金牌训练营——搜索专题
NOIP2018提高组金牌训练营——搜索专题 1416 两点 福克斯在玩一款手机解迷游戏,这个游戏叫做”两点”.基础级别的时候是在一个n×m单元上玩的.像这样: 每一个单元有包含一个有色点.我们将用不 ...
- uva 6757 Cup of Cowards(中途相遇法,貌似)
uva 6757 Cup of CowardsCup of Cowards (CoC) is a role playing game that has 5 different characters (M ...
- hdu-5933----hdu-5943
hdu-5933 思路: 贪心,首先要求总和是k的倍数,而又要求相邻,说明相邻的一块如果是sum/k的倍数,那么就地切割这样才能使操作数目最少; hdu-5934 思路: 强连通分量,可以找出强连通分 ...
- ACM 杂题,思路题 整理
UVa 11572 - Unique Snowflakes 问一个数组中,无重复数字的最长子串长度是多少. 用map维护某数字上次出现的位置.另外用变量last表示上次出现数字重复的位置. 如果出现重 ...
随机推荐
- 2015 Multi-University Training Contest 5 hdu 5348 MZL's endless loop
MZL's endless loop Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Oth ...
- 玩转iOS开发 - Runloop 具体解释
Runloop 具体解释
- 《从零開始学Swift》学习笔记(Day 46)——下标重写
原创文章.欢迎转载.转载请注明:关东升的博客 下标是一种特殊属性. 子类属性重写是重写属性的getter和setter訪问器,对下标的重写也是重写下标的getter和setter訪问器. 以下看一个演 ...
- SEO分享:关于SEO的十个问题
想写的幽默一点,幽默细胞太少,想写的专业一点,又不够专业,结果就出现了这篇不伦不类的怪文,望海涵! 导读:前面写过一篇类似的文章,受到的评价好坏都有吧.有人说讲的没有实质性的内容,有些人抱怨回答的太过 ...
- STL 之 iterator traits 备忘
//5种迭代器.为了激活重载机制,定义的5个类型.每种迭代器就是一个类型. struct input_iterator_tag{}; struct output_iterator_tag{}; str ...
- nodejs即时聊天
一直想做一个即时聊天的应用,前几天看到了socket.io,感觉还不错.自己略加改动,感觉挺不错的.官网上给的样例非常easy,以下改进了一点,实现了历史消息的推送. demo地址:chat.code ...
- JAVA设计模式之【代理模式】
代理模式 通过代理对象间接访问 代购 客户端不想或者不能直接访问一个对象,可以通过一个称为代理的第三者来实现间接访问,该方案称为代理模式 角色 抽象主题角色Subject 声明真实主题类与代理类的公共 ...
- [Swift]数组(Array)最强解析
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- 51nod 1096 距离之和最小 思维题,求中位数
题目: 在一条直线上,与两个点距离之和最小的点,是怎样的点? 很容易想到,所求的点在这两个已知点的中间,因为两点之间距离最短. 在一条直线上,与三个点距离之和最小的点,是怎样的点? 由两个点的规律,我 ...
- POJ 1195 Mobile phones【 二维树状数组 】
题意:基础的二维数组,注意 0 + lowbit(0)会陷入无限循环----- 之前做一道一维的一直tle,就是因为这个-------------------------- #include<i ...