LA 2965 中途相遇法
题目链接:https://vjudge.net/problem/UVALive-2965
题意:
有很多字符串(24),选出一些字符串,要求这些字符串的字母都是偶数次;
分析:
暴力2^24也很大了,中途相遇法;其原理就是一分为二,两组解组成问题的解;
考虑到,每个字符串出现的次数没什么关系,只要关于他的奇偶,那么就有二进制,1出现奇数次,0偶数次;
每一个字符串对应于一个A位向量,
在前半个表中,选择一些字符串(2^12),又得到一个位向量 x,要是表中存在,则选择 字符串个数较多者;
然后枚举下半个表,要是表Map中有对应的向量,就说么这两组解会构成一个满足题意的解,
#include <bits/stdc++.h> using namespace std; const int maxn = ;
map<int,int> table; // 二进制有多少个1
int bitcount(int x) {
if(x==) return ;
else return bitcount(x/) + (x&);
} int main()
{
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]^=(<<(s[j]-'A'));
}
} table.clear();
int n1 = n/,n2 = n - n1;
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))
table[x] = i; // 字符串集合 x 对应的哪些字符串
} 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))
ans = (i<<n1)^table[x];
} printf("%d\n",bitcount(ans));
for(int i=;i<n;i++)
if(ans&(<<i))
printf("%d ",i+);
puts(""); } return ;
}
LA 2965 中途相遇法的更多相关文章
- LA 2965 Jurassic Remains (中途相遇法)
Jurassic Remains Paleontologists in Siberia have recently found a number of fragments of Jurassic pe ...
- 【UVALive】2965 Jurassic Remains(中途相遇法)
题目 传送门:QWQ 分析 太喵了~~~~~ 还有中途相遇法这种东西的. 嗯 以后可以优化一些暴力 详情左转蓝书P58 (但可能我OI生涯中都遇不到正解是这个的题把...... 代码 #include ...
- uva 6757 Cup of Cowards(中途相遇法,貌似)
uva 6757 Cup of CowardsCup of Cowards (CoC) is a role playing game that has 5 different characters (M ...
- HDU 5936 Difference 【中途相遇法】(2016年中国大学生程序设计竞赛(杭州))
Difference Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- 【中途相遇法】【STL】BAPC2014 K Key to Knowledge (Codeforces GYM 100526)
题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show& ...
- 高效算法——J 中途相遇法,求和
---恢复内容开始--- J - 中途相遇法 Time Limit:9000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Su ...
- uva1152 - 4 Values whose Sum is 0(枚举,中途相遇法)
用中途相遇法的思想来解题.分别枚举两边,和直接暴力枚举四个数组比可以降低时间复杂度. 这里用到一个很实用的技巧: 求长度为n的有序数组a中的数k的个数num? num=upper_bound(a,a+ ...
- 中途相遇法 解决 超大背包问题 pack
Description [题目描述] 蛤布斯有n个物品和一个大小为m的背包,每个物品有大小和价值,它希望你帮它求出背包里最多能放下多少价值的物品. [输入数据] 第一行两个整数n,m.接下来n行每行两 ...
- 紫书 例题8-3 UVa 1152(中途相遇法)
这道题要逆向思维, 就是求出答案的一部分, 然后反过去去寻找答案存不存在. 其实很多其他题都用了这道题目的方法, 自己以前都没有发现, 这道题专门考这个方法.这个方法可以没有一直往下求, 可以省去很多 ...
随机推荐
- Tomcat常见问题
1. tomcat主页 http://localhost:8080 打不开 设置环境变量JAVA_HOME,确认端口为8080,查看webapps\ROOT文件夹是否存在 2. 访问tomcat管理页 ...
- 事物及exec
事物3要出不多讲: 1.BEGIN TRANSACTION--开启事务 2.COMMIT TRANSACTION--事务执行 3.ROLLBACK TRANSACTION--事务回滚 俩总捕捉事物的方 ...
- php数组·的方法-数组与数据结构
/*数组与数据结构*/ //shuffle() 随机打乱数组 //array_push() 数组末尾添加元素 //array_pop() 数组末尾删除元素 //array_shift() 数组首位删除 ...
- SQL Server Reporting Service(SSRS) 第四篇 SSRS 常见问题总结
1. 如何让表头在每页显示(译) A. 打开高级模式: 在分组栏中点击Column Goups右侧的箭头选择高级模式; B. 找到第一个Static组 在Row Groups区域中(注意不是Colu ...
- VIM操作手札
查看帮助手册 [Vim 中文帮助文档] 常用命令及说明 在命令模式下编辑 命令 说明 Ctrl+u 向文件首翻半屏 Ctrl+d 向文件尾翻半屏 Ctrl+f 向文件尾翻一屏 Ctrl+b 向文件首翻 ...
- 数据库事务的四个特性(ACID)、事务的隔离级别
事务是一个不可分割的最小逻辑工作单元. 事务具有四个特征:原子性( Atomicity ).一致性( Consistency ).隔离性( Isolation )和持久性( Durability ). ...
- 2019.03.19 读书笔记 string与stringbuilder的性能
1 string与stringbuilder 并不是stringbuilder任何时候都在性能上占优势,在少量(大约个位数)的字符串时,并不比普通string操作快. string慢的原因不是stri ...
- python 选取Serise、DataFrame列的子集方法
- java替换word表格2007
package demo;import java.io.FileOutputStream;import java.util.HashMap;import java.util.Iterator;impo ...
- hibernate打印sql日志及参数
#log4j.properties log4j.rootLogger=info, CA# ConsoleAppenderlog4j.appender.CA=org.apache.log4j.Conso ...