UVa LA 2965 - Jurassic Remains 中间相遇,状态简化 难度: 2
题目
https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=966
题意
n个大写字母串(n <= 24),问最多取多少个,使得所有字符出现的次数都是偶数。
思路
如刘书
1. 由于最多出现26个字母,而且字母在字符串中出现的次数本身不重要,只要记录奇偶性,所以可以将这些字符串转化为01串便于存储。
2. 问题转化为最多取多少个01串,使得其异或结果为0
3. 这样就可以用2^24来枚举,但这样状态还是太多了
4. 问题可以转化为前n/2个字符串子集组成的异或结果与后n/2个字符串子集组成的异或结果相同的情况下,最多取多少个字符串。
感想
1. 一开始忘了字符串本身可能存在重复的字符串
2. 之后忘了程序会修改pos
代码
#include <algorithm>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <string>
#include <tuple>
#define LOCAL_DEBUG
using namespace std;
const int MAXN = ;
int n;
int a[MAXN];
int staStack[ << MAXN];
int posStack[ << MAXN]; int bone2sta(char * str) {
int sta = ;
for (char * p = str; *p != ; p++) {
sta ^= << (*p - 'A');
}
return sta;
} int getDigitCnt(int x) {
int ans = ;
while (x > ) {
x -= (x & -x);
ans++;
}
return ans;
} int main() {
#ifdef LOCAL_DEBUG
freopen("C:\\Users\\Iris\\source\\repos\\ACM\\ACM\\input.txt", "r", stdin);
freopen("C:\\Users\\Iris\\source\\repos\\ACM\\ACM\\output.txt", "w", stdout);
#endif // LOCAL_DEBUG
//int T;
// scanf("%d", &T); for (int ti = ;scanf("%d", &n) == && n; ti++) {
for (int i = ; i < n; i++) {
char buff[];
scanf("%s", buff);
a[i] = bone2sta(buff);
}
int half_n = n / ;
map<int, int> sta2pos;
sta2pos[] = ;
int staCnt = ;
staStack[staCnt++] = ;
for (int i = ; i < half_n; i++) {
for (int j = staCnt - ; j >= ; j--) {
posStack[j] = sta2pos[staStack[j]];
}
for (int j = staCnt - ; j >= ; j--) {
int sta = staStack[j];
int pos = posStack[j];
int newSta = sta ^ a[i];
int newPos = pos | ( << i);
if (sta2pos.count(newSta) == ) {
sta2pos[newSta] = newPos;
staStack[staCnt++] = newSta; }
else {
int oldDigitCnt = getDigitCnt(sta2pos[newSta]);
int newDigitCnt = getDigitCnt(pos) + ;
if(newDigitCnt > oldDigitCnt)sta2pos[newSta] = newPos;
}
}
}
map<int, int> othersta2pos;
othersta2pos[] = ;
staCnt = ;
staStack[staCnt++] = ;
for (int i = half_n; i < n; i++) {
for (int j = staCnt - ; j >= ; j--) {
posStack[j] = othersta2pos[staStack[j]];
}
for (int j = staCnt - ; j >= ; j--) {
int sta = staStack[j];
int pos = posStack[j];
int newSta = sta ^ a[i];
int newPos = pos | ( << i);
if (othersta2pos.count(newSta) == ) {
othersta2pos[newSta] = newPos;
staStack[staCnt++] = newSta; }
else {
int oldDigitCnt = getDigitCnt(othersta2pos[newSta]);
int newDigitCnt = getDigitCnt(pos) + ;
if (newDigitCnt > oldDigitCnt)othersta2pos[newSta] = newPos;
}
}
}
int ans = , ansPos = ;
for (int j = ; j < staCnt; j++) {
int sta = staStack[j];
if (sta2pos.count(sta) != ) {
int digitCnt = getDigitCnt(sta2pos[sta]) + getDigitCnt(othersta2pos[sta]);
if (digitCnt > ans) {
ans = digitCnt;
ansPos = sta2pos[sta] | othersta2pos[sta];
}
}
}
printf("%d\n", ans);
for (int i = ; i < n; i++) {
if (ansPos & ( << i)) {
printf("%d ", i + );
}
}
puts("");
} return ;
}
UVa LA 2965 - Jurassic Remains 中间相遇,状态简化 难度: 2的更多相关文章
- LA 2965 Jurassic Remains (中途相遇法)
Jurassic Remains Paleontologists in Siberia have recently found a number of fragments of Jurassic pe ...
- LA 2965 Jurassic Remains
这是我做的第一道状态压缩的题目,而且我自己居然看懂了,理解得还算透彻. 题意:给出若干个大写字母组成的字符串,然后选取尽量多的字符串使得这些字母出现偶数次. 最朴素的想法,穷举法:每个字符串只有选和不 ...
- UVALive - 2965 Jurassic Remains (LA)
Jurassic Remains Time Limit: 18000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu [Sub ...
- 【UVALive】2965 Jurassic Remains(中途相遇法)
题目 传送门:QWQ 分析 太喵了~~~~~ 还有中途相遇法这种东西的. 嗯 以后可以优化一些暴力 详情左转蓝书P58 (但可能我OI生涯中都遇不到正解是这个的题把...... 代码 #include ...
- UVaLive 2965 Jurassic Remains (状态压缩)
题意:给定 n 个大写字母组成的字符串,选择尽量多的串,使得大写字母都能出现偶数次. 析:由于n比较小,我们可以枚举前n/2的所有组合,然后再从后面查找. 代码如下: #pragma comment( ...
- uvalive 2965 Jurassic Remains
https://vjudge.net/problem/UVALive-2965 题意: 给出若干个由大写字母组成的字符串,要求选出尽量多的字符串,使得每个大写字母出现的次数是偶数. 思路: 如果说我们 ...
- 【中途相遇+二进制】【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 因为博主的英文 ...
- UVA LA 7146 2014上海亚洲赛(贪心)
option=com_onlinejudge&Itemid=8&page=show_problem&category=648&problem=5158&mosm ...
随机推荐
- The content of element type "web-app" must match "(icon?,display-name?,description?,distributable?,context-param*,filter*,filter-mapping*,listener*,servlet*,servlet- mapping*,session-config?,mime-map
修改了一下web.xml,加入了一个<filter>,然后就报这样的错??? The content of element type "web-app" must ma ...
- 学习笔记57—归一化 (Normalization)、标准化 (Standardization)和中心化/零均值化 (Zero-centered)
1 概念 归一化:1)把数据变成(0,1)或者(1,1)之间的小数.主要是为了数据处理方便提出来的,把数据映射到0-1范围之内处理,更加便捷快速.2)把有量纲表达式变成无量纲表达式,便于不同单位或 ...
- JAVA基础知识总结:十二
一.String类 字符串是一种特殊的对象,一旦被初始化就不能被改变了 字符串常量存储于常量池中 二.StringBuffer类 是一个字符串缓冲区,相当于一个容器 特点 a.可以对字符串进行增加和删 ...
- ionic toggle点击返回true/false支持自定义
<ul class="list"> <li class="item item-toggle"> 手机提醒 <label class ...
- traceback模块——获取详细的异常信息
try: 1/0 except Exception,e: print e 输出结果是integer division or modulo by zero,只知道是报了这个错,但是却不知道在哪个文件哪个 ...
- (转+整理)C#中动态执行代码
通过微软提供的CSharpCodeProvider,CompilerParameters,CompilerResults等类,可以在运行时,动态执行自己写的代码文件.原理就是把你的代码文件动态编译成e ...
- 7 selenium 模块
selenium 模块 一.简介 1.Python的一个第三方库,对外提供的接口可以操作浏览器,然后让浏览器完成自动化的操作. 2.自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接 ...
- Prime Ring Problem HDU - 1016
A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle ...
- python time 表示方式
- Android BottomNavigationBar底部导航控制器的使用(包含默认postion的设置)
转载请标明出处:http://blog.csdn.net/u010046908/article/details/50962081本文出自:[李东的博客] 最近Google在自己推出的Material ...