这是我做的第一道状态压缩的题目,而且我自己居然看懂了,理解得还算透彻。

题意:给出若干个大写字母组成的字符串,然后选取尽量多的字符串使得这些字母出现偶数次。

最朴素的想法,穷举法:每个字符串只有选和不选两种情况,那么穷举的时间复杂度是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的更多相关文章

  1. LA 2965 Jurassic Remains (中途相遇法)

    Jurassic Remains Paleontologists in Siberia have recently found a number of fragments of Jurassic pe ...

  2. UVa LA 2965 - Jurassic Remains 中间相遇,状态简化 难度: 2

    题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  3. UVALive - 2965 Jurassic Remains (LA)

    Jurassic Remains Time Limit: 18000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu [Sub ...

  4. uvalive 2965 Jurassic Remains

    https://vjudge.net/problem/UVALive-2965 题意: 给出若干个由大写字母组成的字符串,要求选出尽量多的字符串,使得每个大写字母出现的次数是偶数. 思路: 如果说我们 ...

  5. 【UVALive】2965 Jurassic Remains(中途相遇法)

    题目 传送门:QWQ 分析 太喵了~~~~~ 还有中途相遇法这种东西的. 嗯 以后可以优化一些暴力 详情左转蓝书P58 (但可能我OI生涯中都遇不到正解是这个的题把...... 代码 #include ...

  6. UVaLive 2965 Jurassic Remains (状态压缩)

    题意:给定 n 个大写字母组成的字符串,选择尽量多的串,使得大写字母都能出现偶数次. 析:由于n比较小,我们可以枚举前n/2的所有组合,然后再从后面查找. 代码如下: #pragma comment( ...

  7. 【中途相遇+二进制】【NEERC 2003】Jurassic Remains

    例题25  侏罗纪(Jurassic Remains, NEERC 2003, LA 2965) 给定n个大写字母组成的字符串.选择尽量多的串,使得每个大写字母都能出现偶数次. [输入格式] 输入包含 ...

  8. Meeting-in-the-Middle (LA 2965)

    Meeting-in-the-Middle,又称“中途相遇法”.准确地说,它只是一种策略. 顺便说一下,这个算法真的很冷门! 结合这道题来讨论一下吧:LA 2965.ε(┬┬﹏┬┬)3 因为博主的英文 ...

  9. LA2965 Jurassic Remains

    Jurassic Remains https://vjudge.net/problem/UVALive-2965 Paleontologists in Siberia have recently fo ...

随机推荐

  1. 编写单例的 dojo class

    define([ "dojo/_base/declare" ],function( declare ){ var TimeChartService = declare(" ...

  2. eclipse编译项目jar,git管理代码

    2015-3-10 settings.xml文件: <localRepository>C:\Users\xxx\.m2\repository</localRepository> ...

  3. 机器学习(一):梯度下降、神经网络、BP神经网络

    这几天围绕论文A Neural Probability Language Model 看了一些周边资料,如神经网络.梯度下降算法,然后顺便又延伸温习了一下线性代数.概率论以及求导.总的来说,学到不少知 ...

  4. POJ 2674

    Linear world Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 2448   Accepted: 564 Descr ...

  5. 获取及管理Android 手机运营商及状态

    主要类 TelephonyManager: telephonyManager.getCellLocation();//获得服务区 telephonyManager.getCellId();//获得服务 ...

  6. hdu 1847 Good Luck in CET-4 Everybody!(简单博弈SG)

    #include<stdio.h> #include<string.h> #define N 1010 int hash[N]; int sg[N]; void GetSG() ...

  7. Junit单元测试学习笔记三

    一.     高级 Fixture 上一篇文章中我们介绍了两个 Fixture 标注,分别是 @Before 和 @After ,我们来看看他们是否适合完成如下功能:有一个类是负责对大文件(超过 50 ...

  8. JAVA数据库连接池实现(转)

    连接池的管理用了了享元模式,这里对连接池进行简单设计. 一.设计思路 1.连接池配置属性DBbean:里面存放可以配置的一些属性 2.连接池接口IConnectionPool:里面定义一些基本的获取连 ...

  9. 跨浏览器兼容的HTML5视频音频播放器

    HTML5的video和audio标签是用来在网页中加入视频和音频的标签,在支持html5的浏览器中不需要预先加载Adobe Flash浏览器插件就能轻松快速的播放视频和音频文件.而html5medi ...

  10. Bootstrap全屏

    1.由于bootstrap中的.containter是根据媒体查询定死了width,所以页面不会占满全屏,若要全屏,则最外面的div的class不能用container(或改用.container-f ...