题意:

有N个学生。有M题目

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

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

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



思路:

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

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

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



  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stack>
  5. #include <queue>
  6. #include <map>
  7. #include <set>
  8. #include <vector>
  9. #include <math.h>
  10. #include <bitset>
  11. #include <algorithm>
  12. #include <climits>
  13. using namespace std;
  14.  
  15. #define ls 2*i
  16. #define rs 2*i+1
  17. #define UP(i,x,y) for(i=x;i<=y;i++)
  18. #define DOWN(i,x,y) for(i=x;i>=y;i--)
  19. #define MEM(a,x) memset(a,x,sizeof(a))
  20. #define W(a) while(a)
  21. #define gcd(a,b) __gcd(a,b)
  22. #define LL long long
  23. #define ULL unsigned long long
  24. #define N 100005
  25. #define INF 0x3f3f3f3f
  26. #define EXP 1e-8
  27. #define rank rank1
  28. const int mod = 1000000007;
  29.  
  30. int t,n,m;
  31. char str[50][50];
  32. int a[50];
  33. LL num[50][2];
  34. int hsh[1<<16]= {0};
  35.  
  36. int main()
  37. {
  38. int i,j,k;
  39. for(i = 0; i<(1<<16); i++)//hsh记录1的个数
  40. {
  41. t = i;
  42. while(t)
  43. {
  44. hsh[i]+=t%2;
  45. t/=2;
  46. }
  47. }
  48. scanf("%d",&t);
  49. while(t--)
  50. {
  51. LL ans = 0;
  52. map<LL,int> cnt;
  53. map<LL,int> state;
  54. scanf("%d%d",&n,&m);
  55. for(i = 0; i<n; i++)
  56. {
  57. scanf("%s%d",str[i],&a[i]);
  58. num[i][0]=num[i][1] = 0;
  59. for(j = 0; j<m/2; j++)//记录前一半的2进制状态
  60. num[i][0] = num[i][0]*2+(str[i][j]-'0');
  61. for(j = m/2; j<m; j++)//记录后一半的2进制状态
  62. num[i][1] = num[i][1]*2+(str[i][j]-'0');
  63. }
  64. //前半部的处理
  65. int s = m/2;
  66. for(i = 0; i<(1<<s); i++)
  67. {
  68. LL tem = 0;
  69. for(j = 0; j<n; j++)
  70. {
  71. k = hsh[i^num[j][0]];//与答案不同样的个数
  72. if(s-k>a[j]) break;
  73. tem = tem*30+s-k;//30进制存状态
  74. }
  75. if(j==n)
  76. {
  77. cnt[tem]++;//该状态有几种
  78. state[tem] = i;
  79. }
  80. }
  81. s = m-s;//后一半
  82. int s1,s2;
  83. for(i = 0; i<(1<<s); i++)
  84. {
  85. LL tem = 0;
  86. for(j = 0; j<n; j++)
  87. {
  88. k = hsh[i^num[j][1]];
  89. if(s-k>a[j]) break;
  90. tem = tem*30+a[j]-(s-k);//找回前一半的状态
  91. }
  92. if(j==n&&cnt[tem])
  93. {
  94. ans+=cnt[tem];
  95. s1 = state[tem];
  96. s2 = i;
  97. }
  98. }
  99. if(ans==1)
  100. {
  101. stack<int> Q;
  102. for(i = 0; i<s; i++)
  103. {
  104. Q.push(s2%2);
  105. s2/=2;
  106. }
  107. for(i = 0; i<m-s; i++)
  108. {
  109. Q.push(s1%2);
  110. s1/=2;
  111. }
  112. while(!Q.empty())
  113. {
  114. printf("%d",Q.top());
  115. Q.pop();
  116. }
  117. printf("\n");
  118. }
  119. else
  120. printf("%d solutions\n",ans);
  121. }
  122.  
  123. return 0;
  124. }

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. 笔试中java的输入输出

    一,输入 import java.util.*; import java.io.*; public class Main { public static void main(String[] args ...

  2. 什么叫openapi

    Open API即开放API,也称开放平台. 所谓的开放API(OpenAPI)是服务型网站常见的一种应用,网站的服务商将自己的网站服务封装成一系列API(Application Programmin ...

  3. Android集成一个新产品时,lunch的product name和device name注意事项

    Android系统lunch一个当前的Product大概流程包括下面几个部分: 1. lunch确定TARGET_PRODUCT.一般位于vendor/device/build/target/prod ...

  4. C++ 虚函数的缺省參数问题

    前些日子,有个同学问我一个关于虚函数的缺省參数问题.他是从某个论坛上看到的.可是自己没想通.便来找我. 如今分享一下这个问题.先看一小段代码: #include <iostream> us ...

  5. jquery 函数的定义

    var ss_login = { ptjy : function(method) { CloseAlert(); if( getLocalData("ActivePTJYUser" ...

  6. Android Studio 修改注释模板中的${USER}变量以及修改默认的头部注释

    引言 通常我们创建类文件都会自动生成一段头部注释. 有时候这不是我们想要的效果. 它默认是Created By XXX. 而我们要的是@author XXX. 而且这里面的XXX是系统的的用户名,不一 ...

  7. c:\Windows\System32\drivers\etc\hosts的作用

    c:\Windows\System32\drivers\etc\hosts 是域名解析文件. 可以直接用记事本打开.将IP地址重定向. 格式为:ip地址-空格-域名 可以将一个域名重新定向到一个IP ...

  8. [jzoj NOIP2018模拟11.02]

    嗯T1忘记取模了,100到20 嗯T2忘记了那啥定理,暴力也写炸了,这题我认 嗯T3线段树合并分裂没有写炸,考场上就知道妥妥的70分.但是,分数出的时候听到有人说暴力也是70分,我???脸黑,枉我敲了 ...

  9. 引用axiv文献的问题

    首先找了一下对8种常见引用格式进行说明的文章 https://blog.csdn.net/wkd22775/article/details/51798927 然后就是水木社区大神们的记录http:// ...

  10. latex简历遇到的问题

    博一时候简历就没弄出来,现在又要用了,于是找出当初的模板.发现问题在于编码. \XeTeXinputencoding "GBK" \XeTeXdefaultencoding &qu ...