博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uva2965
阅读量:5167 次
发布时间:2019-06-13

本文共 1426 字,大约阅读时间需要 4 分钟。

奇偶性转成xor问题

map的应用,xor到集合的映射使问题大大简化。

bitcount()的写法

中途相遇法的应用。

#include 
#include
using namespace std;const int maxn = 30;map
table;int n;int a[maxn];char s[1005];int bitcount(int x){ return x == 0 ? 0 : bitcount(x / 2) + (x & 1);//统计有多少个1 //一定要写成(x & 1)的形式。 }int main(){ while(~scanf("%d", &n)) { for (int i = 0; i < n; i++) { scanf("%s", s); a[i] = 0; for (int j = 0; s[j] != '\0'; j++) a[i] ^= (1 << (s[j] - 'A')); } table.clear(); int n1 = n / 2, n2 = n - n1; for (int i = 0; i < (1 << n1); i++)//枚举前一半 { int x = 0; for (int j = 0; j < n1; j++) if (i & (1 << j)) x ^= a[j]; if (!table.count(x) || bitcount(table[x]) < bitcount(i)) table[x] = i;//table[x]表示的是xor值为x的bitcount最大的集合。 } int ans = 0; for (int i = 0; i < (1 << n2); i++) { int x = 0; for (int j = 0; j < n2; j++) if (i & (1 << j)) x ^= a[n1 + j]; if (table.count(x) && bitcount(ans) < bitcount(table[x]) + bitcount(i))//tabel.count(x) != 0意味着两个集合配对可以成立。 ans = (i << n1) ^ table[x]; } printf("%d\n", bitcount(ans)); for (int i = 0; i < n; i++) if (ans & (1 << i)) printf("%d ", i + 1); printf("\n"); } return 0;}

 

转载于:https://www.cnblogs.com/yohanlong/p/7715640.html

你可能感兴趣的文章
docfx (一)
查看>>
HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别
查看>>
3.3-3.4.5 变量和数据类型
查看>>
Unity5.6之前版本VRTK插件基础交互
查看>>
深度学习之前馈神经网络(前向传播和误差反向传播)
查看>>
IEnumerable<T>和IQueryable<T>区别
查看>>
【luogu P3381 最小费用最大流】 模板
查看>>
(转)MFC界面风格
查看>>
迁移ORACLE数据库文件到ASM
查看>>
Centos7 tmux1.6 安装
查看>>
二叉树(三)
查看>>
linux加密文件系统 fsck 无法修复一例
查看>>
【linux配置】VMware安装Redhat6.5
查看>>
C++语法查询在线手册
查看>>
盒子垂直方向外边距合并和盒子塌陷
查看>>
应届生就职前要读的几本书
查看>>
计算机经典书籍之程序设计语言
查看>>
jQuery应用实例2:简单动画
查看>>
<Learning How to Learn>Week One: Focused versus Diffuse Thinking
查看>>
基于霍尔元件的电机转速测量
查看>>