题目大意:

给出n个字符串,字符串仅由大写字母组成,问你用最多的字符串使得这些字符串里面的字符出现的总次数为偶数次

解题思路:

1.dfs+位运算

2.中途相遇法

第一种思路就是普通的搜索,因为数据规模不是非常大,所以用搜索加上位运算也是可以通过所有数据的。

第二种思路是中途相遇法,先考虑这n个字符串的前n/2个,把每个字符串的状态记录到map里面,再枚举后面的所有字符串的状态,在map中寻找是否存在这个状态。然后找到答案,时间复杂度是O(2^(n/2) * logn)或者更低

代码:

dfs+位运算

#include <vector>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;string str;
int ans, status, num[26];
void dfs(int n, int flag, int cnt, int st) {if (n == 0) {if (cnt < ans) return;if (!flag) {ans = cnt; status = st;}return;}dfs(n-1, flag ^ num[n], cnt + 1, st | (1 << (n-1)));dfs(n-1, flag, cnt, st);
}
int main() {ios::sync_with_stdio(false); cin.tie(0);int n, len, pos;while (cin >> n) {vector<int> vec; vec.clear();memset(num, 0, sizeof(num));for (int i = 1; i <= n; ++i) {cin >> str;len = str.length();for (int j = 0; j < len; ++j) {num[i] ^= (1 << (str[j] - 'A'));}}ans = 0, status = 0, pos = 1;dfs(n, 0, 0, 0);cout << ans << endl;while (status) {if (status & 1) vec.push_back(pos);++pos; status >>= 1;}pos = vec.size();for (int i = 0; i < pos; ++i) {if (i) cout << " ";cout << vec[i];}cout << endl;}return 0;
}

中途相遇法

#include <map>
#include <vector>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;string str;
vector<int> vec;
map<int, int> mp;
map<int, int>::iterator it;int num[26];inline int bitCount(int st) {int cnt = 0;while (st) {if (st & 1) ++cnt;st >>= 1;}return cnt;
}
int main() {ios::sync_with_stdio(false); cin.tie(0);int n, len, pos;while (cin >> n) {vec.clear(); mp.clear();int ans, res, status, half;memset(num, 0, sizeof(num));for (int i = 0; i < n; ++i) {cin >> str;len = str.length();for (int j = 0; j < len; ++j) {num[i] ^= (1 << (str[j] - 'A'));}}half = (1 << (n >> 1));for (int i = 0; i < half; ++i) {int flag = 0;for (int j = 0; j < (n >> 1); ++j) {if (i & (1 << j)) flag ^= num[j];}it = mp.find(flag);if (it == mp.end()) {mp[flag] = i;} else {if (bitCount(it -> second) < bitCount(i)) {it -> second = i;}}}ans = 0; res = 0;status = (1 << (n - (n >> 1)));for (int i = 0; i < status; ++i) {int flag = 0;for (int j = n >> 1; j < n; ++j) {if (i & (1 << (j - (n >> 1)))) {flag ^= num[j];}}it = mp.find(flag);if (it != mp.end()) {half = i << (n >> 1);int cnt = bitCount(half + it -> second);if (ans < cnt) {ans = cnt;res = half + it -> second;}}}cout << ans << endl;ans = 1;while (res) {if (res & 1) vec.push_back(ans);++ans;res >>= 1;}ans = vec.size();for (int i = 0; i < ans; ++i) {if (i) cout << " ";cout << vec[i];}cout << endl;}return 0;
}

转载于:https://www.cnblogs.com/wiklvrain/p/8179380.html

POJ-1903 Jurassic Remains相关推荐

  1. UVa 1326 - Jurassic Remains

    中途相遇法,新学的东西,大概意思是把数据分为两部分,先考虑第一部分,把结果保存到一个映射里,再考虑第二部分,得出结果后再在第一部分的映射里查找并进行计算.不过不明白为什么时间复杂度是O(1.44n l ...

  2. POJ前面的题目算法思路【转】

    1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 85% 2005-5-7 1002 487-3279 n/a 90% 2005-5- ...

  3. POJ 超详细分类

    POJ 各题算法 1000    A+B Problem            送分题     49%    2005-5-7 1001    Exponentiation         高精度   ...

  4. ACM题集以及各种总结大全(转)

    ACM题集以及各种总结大全! 虽然退役了,但是整理一下,供小弟小妹们以后切题方便一些,但由于近来考试太多,顾退役总结延迟一段时间再写!先写一下各种分类和题集,欢迎各位大牛路过指正. 一.ACM入门 关 ...

  5. 搜索题,留着以后慢慢刷

    转过来,留着以后慢 慢 刷555.. 简单搜索 (1)深度优先搜索 (poj2488,poj3009,poj1321) (2)广度优先搜索 (poj3278,poj1426,poj3126,poj30 ...

  6. 2018/8/9 MultiU 6 并查集+dfs,反向建边提高查询效率 !!! / 最大字段和n维(降维)/ 状压+中途相遇法...

    hdu6370 Werewolf http://acm.hdu.edu.cn/showproblem.php?pid=6370 题意:村民只能说真话,狼人"可以"撒谎,每个人说一句 ...

  7. 《算法竞赛入门经典——训练指南》第一章相关内容

    #<算法竞赛入门经典--训练指南>第一章相关内容 希望各位大牛能指导! 红色为已经做了的...黄色背景是还有不懂地方,希望在年前能刷完第一章啊.... 更新版.google上貌似又加了ex ...

  8. POJ 1696 Space Ant(极角排序)【计算几何】

    ACM博客_kuangbin POJ 1696 Space Ant(极角排序) Space Ant Time Limit: 1000MS   Memory Limit: 10000K Total Su ...

  9. (精)【ACM刷题之路】POJ题目详细多角度分类及推荐题目

    POJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094) 初期: ...

最新文章

  1. ccf 交通规划(迪杰斯特拉优先队列模板)
  2. 统计数据背后的指数分布模型
  3. 强化学习:Policy-based方法Part2
  4. sjms-3 结构型模式
  5. android四个按钮平分,android 水平平分两个按钮
  6. Java高级篇 -- List选择及优化
  7. 主成分分析和因子分析十大不同点
  8. AVL树双旋转+图解
  9. 如何给mac地址赋值_交换机工作基础——MAC地址表的构成与安全
  10. 清爽娱乐网系统源码 v5.69
  11. 【jvm】jvm jstack使用 Java线程Dump分析
  12. linux驱动程序文件,急,linux驱动程序是对的为什么生成不了.o驱动程序文件
  13. Matlab报错 :“位置 x 处的索引超出数组边界”
  14. android x5 webview 第一次,android:X5WebView 首次初始化 X5 内核耗时, 会产生卡顿现象的解决办法...
  15. xshell安装python
  16. 移动硬盘上安装WIN7 WIN10系统
  17. 快搜网络爬虫用户代理 User-Agent
  18. 析测结Trimble TILOS v9.0 1CD
  19. IPC网络摄像机NTP校时 时间无法同步问题排查
  20. C++中的名字空间和作用域

热门文章

  1. x等于5y等于8c语言表达式,《C语言程序设计》复习参考题.doc
  2. 文本嵌入的经典模型与最新进展
  3. 官方 Windows 10 正版系统 ISO 镜像文件
  4. 节选转载:你敢向代码库中添加Boost你就等着被开除吧
  5. 测试局域网路的MTU最大值
  6. esri-leaflet入门教程(2)-地图的HelloWorld
  7. 如何有效使用Project
  8. Redis for Windows
  9. 基于flash AS3.0 的BASE64编码与解码类
  10. git:Failed to connect to github.com port 443:.....