LA 2965 Jurassic Remains
这是我做的第一道状态压缩的题目,而且我自己居然看懂了,理解得还算透彻。
题意:给出若干个大写字母组成的字符串,然后选取尽量多的字符串使得这些字母出现偶数次。
最朴素的想法,穷举法:每个字符串只有选和不选两种情况,那么穷举的时间复杂度是O(2n)
优化:将这n个字符串分成两半,先后枚举前n1个字符串所有可能的情况,计算xor值并保存在table中
再枚举后半部分的xor值并在table中查找(因为如果两者的异或值相同,则进行异或运算后的值为0),如果找到,将ans更新为bitcount较大的那种方案。
//#define LOCAL
#include <cstdio>
#include <map>
using namespace std; const int maxn = ;
map<int, int> table; int bitcount(int x)
{//求x对应二进制中1的个数
return (x == ? : (x&) + bitcount(x>>));
} int main(void)
{
#ifdef LOCAL
freopen("2965in.txt", "r", stdin);
#endif int n, a[maxn];
char s[];
while(scanf("%d", &n) == && n)
{
for(int i = ; i < n; ++i)
{
scanf("%s", s);
a[i] = ;
for(int j = ; s[j] !='\0'; ++j) //a[i]为字符串对应的二进制向量
a[i] ^= ( << (s[j] - 'A'));
}
int n1 = n / , n2 = n - n1; //枚举前n1个字符串所有可能组成的异或值
table.clear();
for(int i = ; i < ( << n1); ++i)
{
int x = ;
for(int j = ; j < n1; ++j)
if(i & ( << j))
x ^= a[j];
if(!table.count(x) || bitcount(table[x]) < bitcount(i))
//如果x没有重复或者xor值相同在第i中情况下选择的字符串更多
table[x] = i;
}
//枚举后n2个元素所有组合情况并在table中查找
int ans = ;
for(int i = ; i < ( << n2); ++i)
{
int x = ;
for(int j = ; j < n2; ++j)
if(i & ( << j))
x ^= a[n1 + j];
if(table.count(x) && bitcount(ans) < (bitcount(table[x]) + bitcount(i)))
//x值存在 且 该方案下所选的字符串更多,更新ans的值
ans = (i << n1) ^ table[x];
}
//输出结果
printf("%d\n", bitcount(ans));
for(int i = ; i < n; ++i)
{
if(ans & ( << i))
printf("%d ", i + );
}
printf("\n");
}
return ;
}
代码君
这里顺便还模糊地学习了一下map的用法。。
LA 2965 Jurassic Remains的更多相关文章
- LA 2965 Jurassic Remains (中途相遇法)
Jurassic Remains Paleontologists in Siberia have recently found a number of fragments of Jurassic pe ...
- UVa LA 2965 - Jurassic Remains 中间相遇,状态简化 难度: 2
题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...
- UVALive - 2965 Jurassic Remains (LA)
Jurassic Remains Time Limit: 18000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu [Sub ...
- uvalive 2965 Jurassic Remains
https://vjudge.net/problem/UVALive-2965 题意: 给出若干个由大写字母组成的字符串,要求选出尽量多的字符串,使得每个大写字母出现的次数是偶数. 思路: 如果说我们 ...
- 【UVALive】2965 Jurassic Remains(中途相遇法)
题目 传送门:QWQ 分析 太喵了~~~~~ 还有中途相遇法这种东西的. 嗯 以后可以优化一些暴力 详情左转蓝书P58 (但可能我OI生涯中都遇不到正解是这个的题把...... 代码 #include ...
- UVaLive 2965 Jurassic Remains (状态压缩)
题意:给定 n 个大写字母组成的字符串,选择尽量多的串,使得大写字母都能出现偶数次. 析:由于n比较小,我们可以枚举前n/2的所有组合,然后再从后面查找. 代码如下: #pragma comment( ...
- 【中途相遇+二进制】【NEERC 2003】Jurassic Remains
例题25 侏罗纪(Jurassic Remains, NEERC 2003, LA 2965) 给定n个大写字母组成的字符串.选择尽量多的串,使得每个大写字母都能出现偶数次. [输入格式] 输入包含 ...
- Meeting-in-the-Middle (LA 2965)
Meeting-in-the-Middle,又称“中途相遇法”.准确地说,它只是一种策略. 顺便说一下,这个算法真的很冷门! 结合这道题来讨论一下吧:LA 2965.ε(┬┬﹏┬┬)3 因为博主的英文 ...
- LA2965 Jurassic Remains
Jurassic Remains https://vjudge.net/problem/UVALive-2965 Paleontologists in Siberia have recently fo ...
随机推荐
- c#中的线程一
一.使用线程的理由 1.可以使用线程将代码同其他代码隔离,提高应用程序的可靠性. 2.可以使用线程来简化编码. 3.可以使用线程来实现并发执行 二.基本知识 1.进程与线程:进程作为操作系统执行程序的 ...
- javascript实现数据结构:串--堆分配存储表示
堆分配存储表示 这种存储表示的特点是,仍以一组地址连续的存储单元存放串值字符序列,但它们的存储空间是在程序执行过程中动态分配而得. 结构图: 实现: function HString(){ this. ...
- vim使用指北 ---- Advanced Editing
本节介绍vi和ex的一些高级功能. 配置vi 配置文件.exrc可以保存在你的主目录下,在vi启动的时候执行这个配置文件.但在当前工作目录下可以放置一个配置文件,对当前目录做一个自定义配置. :set ...
- iOS第三方(显示视图的宽度高度)- MMPlaceHolder
github:https://github.com/adad184/MMPlaceHolder#readme appDelegate添加,影响全局 [MMPlaceHolderConfig defau ...
- HDU 1421 搬寝室
搬寝室 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- Java:Comparator接口
public interface Comparator<T> 接口里面的方法 int compare(T o1, T o2) o1 > o2 返回 1 o1 = o2 返回 0 o1 ...
- 刷机(手机自带的recovery)
recovery模式是手机系统的一个工程模式,用户通过同时按住开机键加home键,直到手机界面出现一个三角框里面一个感叹号即是进入了传说中的recovery模式,在这个模式中用户可以看到以下的内容(不 ...
- java多线程理解2
1. 什么时候必须同步?什么叫同步?如何同步? 要跨线程维护正确的可见性,只要在几个线程之间共享非 final 变量,就必须使用 synchronized(或 volatile)以确保一个线程可以看见 ...
- Redis的Set操作
集合的性质: 唯一性,无序性,确定性 注: 在string和link的命令中,可以通过range 来访问string中的某几个字符或某几个元素 但,因为集合的无序性,无法通过下标或范围来访问部分元素. ...
- 在Visual C++下搭建OpenGL的开发环境
1.确保你的电脑已经安装了visual c++编译器 如果还没安装的话,这里有个安装包,可以复制链接进行下载:http://pan.baidu.com/s/1bn4XTqn 2.下载GLUT 下载 ...