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

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

最朴素的想法,穷举法:每个字符串只有选和不选两种情况,那么穷举的时间复杂度是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. JS中showModalDialog 详细使用(转)

    基本介绍: showModalDialog()         (IE 4+ 支持) showModelessDialog()      (IE 5+ 支持) window.showModalDial ...

  2. slot的含义

    1) slot就是槽的意思,是一个资源单位,只有给task分配了一个slot之后,这个task才可以运行.slot分两种,map slot沪蓉reduce slot.另外,slot是一个逻辑概念,一个 ...

  3. codeforces 459C Pashmak and Buses(模拟,组合数A)

    题目 跑个案例看看结果就知道了:8 2 3 题目给的数据是 n,k,d 相当于高中数学题:k个人中选择d个人排成一列,有多少种不同的方案数,列出其中n中就可以了. #include<iostre ...

  4. POJ 2653 Pick-up sticks(线段相交)

    题目链接 题意 : 把每根棍往地上扔,找出最后在上面的棍,也就是说找出所有的没有别的棍子压在它的上面的棍子. 思路 : 对于每根棍子,压在他上面的棍子一定是在它之后扔的棍子,所以在找的时候只要找它之后 ...

  5. 理解Node.js事件驱动编程

    Node.js现在非常活跃,相关生态社区已经超过Lua(基本上比较知名的功能都有nodejs模块实现). 但是我们为何要使用Node.Js?相比传统的webserver服务模式,nodejs有什么优点 ...

  6. java如何追加写入txt文件

    java中,对文件进行追加内容操作的三种方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import java.io.BufferedWriter; import  ...

  7. hdu 4472 Count

    递推,一般的dp值: #include<stdio.h> #include<string.h> #define mod 1000000007 ]; int Dp() { a[] ...

  8. switch中的default的位置

    [转载]http://hi.baidu.com/dannie007zxl/item/5d0c3185577df719c3162724 有的时候,我们对身旁自认为熟悉的东西,却发现很难去给出准确的回答. ...

  9. JTAG的SWD接线方式

    JTAG引脚示意图: 一.SWD 和传统的调试方式区别 1. SWD 模式比 JTAG 在高速模式下面更加可靠 2. GPIO 刚好缺一个的时候, 可以使用 SWD 仿真, 这种模式支持更少的引脚 3 ...

  10. QTableView带可编辑进度条

    main文件与上一个例子完全一致,也使用QStandardItemModel,关键是有这句:QStandardItem.setEditable(false);  继承QAbstractItemDele ...