UVa 1326 - Jurassic Remains
来源:互联网 发布:淘宝返利最高的软件 编辑:程序博客网 时间:2024/05/16 02:02
题意
找出尽量多的串,使每个字母都出现偶数次
思路
因为N<=24,考虑状态压缩。而对于每一个状态,可以用1表示出现奇数,0表示出现偶数,再对一个串中的字母进行状态压缩。
但是如果一直^到最后,复杂度为
这样复杂度就变成
代码
#include<bits/stdc++.h>
#define LL long long
#define lowbit(x) ((x) & (-x))
#define MP(a, b) make_pair(a, b)
const int MAXN = 30 + 5;
const int INF = 0x3f3f3f3f;
using namespace std;
typedef pair<int, int> pii;
typedef vector<int> vei;
typedef vector<pair<int, int> >veii;
typedef vector<int>::iterator viti;
typedef vector<pii>::iterator vitii;
typedef priority_queue<pii, vector<pii>, greater<pii> >pquii;
char word[1000];
int num[MAXN];
map<int, int> mp;
int BitCount(int x)
{
return x == 0 ? 0 : BitCount(x >> 1) + (x & 1);
}
int main()
{
//freopen("input.txt", "r", stdin);
int n, i, j;
while (~scanf("%d", &n))
{
mp.clear();
for (i = 0; i < n; i++)
{
scanf("%s", word);
num[i] = 0;
for (j = 0; word[j]; j++)
num[i] ^= (1 << (word[j] - 'A'));
}
int n1 = n / 2, n2 = n - n1;
for (int state = 0; state < (1 << n1); state++)
{
int cur = 0;
for (i = 0; i < n; i++)
if ((1 << i) & state) cur ^= num[i];
if (!mp.count(cur) || BitCount(mp[cur]) < BitCount(state)) mp[cur] = state;
}
int ans = 0;
for (int state = 0; state < (1 << n2); state++)
{
int cur = 0;
for (int i = 0; i < n2; i++) if (state & (1 << i)) cur ^= num[n1 + i];
if (mp.count(cur) && BitCount(ans) < BitCount(mp[cur]) + BitCount(state))
ans = (state << n1) ^ mp[cur];
}
bool first = true;
printf("%d\n", BitCount(ans));
for (i = 0; i < n; i++)
if ((1 << i) & ans)
{
if (first)
printf("%d", i + 1), first = false;
else printf(" %d", i + 1);
}
puts("");
}
return 0;
}
0 0
- uva 1326 - Jurassic Remains
- UVA 1326 Jurassic Remains
- UVA 1326 Jurassic Remains
- UVa 1326 - Jurassic Remains
- UVA - 1326 Jurassic Remains
- uva 1326 Jurassic Remains(中途相遇法)
- Uva 1326 - Jurassic Remains 中途相遇法
- UVA 1326 - Jurassic Remains(位运算)
- UVA 1326 Jurassic Remains 中途相遇法
- POJ 1903 & ZOJ 2469 & UVA 1326 Jurassic Remains (部分枚举)
- UVA 1326 - Jurassic Remains(技巧枚举+位运算)
- uva 1326 Jurassic Remains(中途相遇法+位运算)
- Jurassic Remains
- Jurassic Remains
- uva 1326 - Jurassic Remains(暴力+位运算+中间相遇法)
- UVa 1326 Jurassic Remains 解题报告(Meet-in-the-Middle)
- POJ-1903-Jurassic Remains
- 2965 - Jurassic Remains
- 常见排序算法(冒泡、选择、插入、快速、归并C++实现)
- select, poll, epoll详解(一)
- linux中线程的挂起与恢复(进程暂停)
- 关于ios程序的后台运行
- Android Dialer,Mms,Contacts源码修改笔记
- UVa 1326 - Jurassic Remains
- 【j2ee】Servlet的总结和实践
- 变量声明和定义的区别
- UIView与CALayer的区别
- MySQL 学习笔记一
- 容我缓一缓
- Vmvare nat模式 WinXP上网
- Java时间和日期类型的Hibernate映射类型
- Java多线程之-----实现自己的ThreadFactory