中途相遇法,新学的东西,大概意思是把数据分为两部分,先考虑第一部分,把结果保存到一个映射里,再考虑第二部分,得出结果后再在第一部分的映射里查找并进行计算。不过不明白为什么时间复杂度是O(1.44logn)。照搬书上的代码如下:

View Code

 1 #include <cstdio>
 2 #include <map>
 3 using namespace std;
 4
 5 int const maxn = 24;
 6 map<int, int> table;
 7
 8 int bitcount(int x)
 9 {
10     return x == 0 ? 0 : bitcount(x/2) + (x&1);
11 }
12
13 int main()
14 {
15 #ifdef LOCAL
16     freopen("in", "r", stdin);
17 #endif
18     int n;
19     char s[1000];
20     int a[maxn];
21     while(scanf("%d", &n) !=EOF && n)
22     {
23         for(int i = 0; i < n; i++)
24         {
25             scanf("%s", s);
26             a[i] = 0;
27             for(int j = 0; s[j] != '\0'; j++)
28                 a[i] ^= (1<<(s[j]-'A'));
29         }
30         table.clear();
31         int n1 = n/2, n2 = n - n1;
32         for(int i = 0; i < (1<<n1); i++)
33         {
34             int x = 0;
35             for(int j = 0; j < n1; j++)
36                 if(i & (1<<j))   x ^= a[j];
37             if(!table.count(x) || bitcount(i) > bitcount(table[x]))
38                 table[x] = i;
39         }
40         int ans = 0;
41         for(int i = 0; i < (1<<n2); i++)
42         {
43             int x = 0;
44             for(int j = 0; j < n2; j++)
45                 if(i & (1<<j))   x ^= a[n1+j];
46             if(table.count(x)  && bitcount(table[x]) + bitcount(i) > bitcount(ans) )
47                 ans = (i<<n1)^table[x];
48         }
49         printf("%d\n", bitcount(ans));
50         for(int i = 0; i < n; i++)
51             if(ans & (1<<i))   printf("%d ", i+1);
52         printf("\n");
53     }
54     return 0;
55 }

转载于:https://www.cnblogs.com/xiaobaibuhei/archive/2013/04/11/3014588.html

UVa 1326 - Jurassic Remains相关推荐

  1. uva 10586 - Polynomial Remains(数论)

    题目链接:uva 10586 - Polynomial Remains 题目大意:给出一个n和k,表示有一个一元n次方程,有0次幂开始给出系数,用这个式子去除以x^k+1,求剩下的一元n-k次方程. ...

  2. POJ-1903 Jurassic Remains

    题目大意: 给出n个字符串,字符串仅由大写字母组成,问你用最多的字符串使得这些字符串里面的字符出现的总次数为偶数次 解题思路: 1.dfs+位运算 2.中途相遇法 第一种思路就是普通的搜索,因为数据规 ...

  3. ACM题集以及各种总结大全(转)

    ACM题集以及各种总结大全! 虽然退役了,但是整理一下,供小弟小妹们以后切题方便一些,但由于近来考试太多,顾退役总结延迟一段时间再写!先写一下各种分类和题集,欢迎各位大牛路过指正. 一.ACM入门 关 ...

  4. 《算法竞赛入门经典——训练指南》第一章相关内容

    #<算法竞赛入门经典--训练指南>第一章相关内容 希望各位大牛能指导! 红色为已经做了的...黄色背景是还有不懂地方,希望在年前能刷完第一章啊.... 更新版.google上貌似又加了ex ...

  5. POJ前面的题目算法思路【转】

    1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 85% 2005-5-7 1002 487-3279 n/a 90% 2005-5- ...

  6. POJ 超详细分类

    POJ 各题算法 1000    A+B Problem            送分题     49%    2005-5-7 1001    Exponentiation         高精度   ...

  7. 2018/8/9 MultiU 6 并查集+dfs,反向建边提高查询效率 !!! / 最大字段和n维(降维)/ 状压+中途相遇法...

    hdu6370 Werewolf http://acm.hdu.edu.cn/showproblem.php?pid=6370 题意:村民只能说真话,狼人"可以"撒谎,每个人说一句 ...

  8. 搜索题,留着以后慢慢刷

    转过来,留着以后慢 慢 刷555.. 简单搜索 (1)深度优先搜索 (poj2488,poj3009,poj1321) (2)广度优先搜索 (poj3278,poj1426,poj3126,poj30 ...

  9. 大白书 1.3节 高效算法设计举例

    大白书 1.3节 高效算法设计举例 例题 17 UVA 11462 简单题,注意那个数值的范围是100以内就可以了. #include <cstdio> #include <cstr ...

最新文章

  1. 规格表管理之删除规格表数据
  2. 安卓开发之使用viewpager+fragment实现滚动tab页
  3. 示波器探头使用注意事项,示波器探头的选择
  4. catia将板环形弯成圆_3.4.3-Catia变换之圆形阵列命令
  5. BZOJ3999: [TJOI2015]旅游
  6. retrofit封装
  7. Ubuntu提示软件更新
  8. 腾讯帝国十八年,被它借鉴过的产品都有哪些?
  9. java方法重写和super关键字
  10. fastdfs5.10 centos6.9 安装配置
  11. 【GIS导论】实验六 叠加分析
  12. 怎么安装winubuntu双系统_U盘安装ubuntu双系统及如何恢复Windows MBR教程
  13. JAVA中如何产生透明的VolatileImage
  14. win10没有android驱动安装不了,WIN10 MTP USB驱动无法安装解决方法
  15. Tomcat的下载安装及静态部署
  16. 小米手机插上android找不到驱动,小米手机连接电脑不显示文件怎么办?
  17. [转]IE Javascript 脚本失效解决办法
  18. 做你的大玩具——轩小样儿的六一
  19. 误码率(BER)测试仪市场研究分析
  20. Android 检测手机是否是异形屏,刘海屏,水滴屏,挖孔屏

热门文章

  1. stm32的rxne和idle中断_STM32 HAL CubeMX 串口IDLE接收空闲中断+DMA
  2. ffmpeg打开音频设备
  3. android 正在上传动画,安卓系统上传文件动态显示进度条,进度条经常卡在99%有时也会卡住不显示完整的文字。...
  4. pomelo mysql_pomelo连接mySQL
  5. Python Types
  6. 1.10 长短期记忆(LSTM)
  7. C语言islower函数介绍、示例和实现
  8. Oracle的where子句
  9. web平台安装程序 无效的uri_1、Linux云计算系列CentOS7网络服务web搭建
  10. 停止、启动或重新启动 VMware vCenter Server Appliance 6.x 及更高版本上的服务 (2109887)