intput

n 1<=n<=24

n串只有大写字母的字符串

output

选出最多个字符串且每个大写字母出现的次数为偶数

第一行输出个数x

第二行输出x个字符串的下标

做法:将每个字符串转化为一个26bit数,1为奇数个大写字母,0为偶数个,则转化为找出最多个数异或和为0,直接枚举为O((2^n)*n),但只有a^a=0,所以将n个数分为两半(中途相遇法),复杂度降为O((2^(n/2))logn)

注意:异或和左半为0和右半为0的要特判,且右半要全部判完,因为可能出现2+3<5+1

 #include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <ctime>
#include <cmath>
#define MAX 100000 using namespace std;
struct node
{
int mark,n;
node operator+(const node&b)const
{
return (node){mark|b.mark,n+b.n};
}
bool operator<(const node&a)const
{
return n<a.n;
}
};
int a[],c[],n,ch,num;
char s[];
node maxn;
map<int,node>q;
map<int,node>::iterator qsum;
void dfs(int x,int mark,int sum,int nn)
{
if(x==n>>)
{
q.insert(make_pair(sum,(node){mark,nn}));
if(sum==) maxn=max(maxn,(node){mark,nn});
return;
}
sum^=a[x];
nn++;
mark|=<<x;
dfs(x+,mark,sum,nn);
sum^=a[x];
nn--;
mark&=~(<<x);
dfs(x+,mark,sum,nn);
}
void find(int x,int mark,int sum,int nn)
{
if(x==n)
{
qsum=q.find(sum);
if(qsum!=q.end()) maxn=max(maxn,qsum->second+(node){mark,nn});
if(sum==) maxn=max(maxn,(node){mark,nn});
return;
}
sum^=a[x];
nn++;
mark|=<<x;
find(x+,mark,sum,nn);
sum^=a[x];
nn--;
mark&=~(<<x);
find(x+,mark,sum,nn);
}
int main()
{
freopen("/home/user/桌面/in","r",stdin);
while(scanf("%d%*c",&n)==)
{
memset(a,,sizeof(a));
for(int i=;i<n;i++)
{
memset(c,,sizeof(c));
scanf("%s",s);
for(int j=;s[j];j++) c[s[j]-'A']++;
for(int j=;j<;j++) if(c[j]&) a[i]|=<<j;
}
if(n==)
{
if(a[]) puts("0\n");
else puts("1\n1");
continue;
}
q.clear();
maxn=(node){,};
dfs(,,,);
find(n>>,,,);
if(maxn.n)
{
printf("%d\n",maxn.n);
for(int i=,j=;i<n;i++)
{
if(maxn.mark&(<<i))
{
if(j) putchar(' ');
printf("%d",i+);
j=;
}
}
printf("\n");
}
else puts("0\n");
}
//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
return ;
}

LA2965 n个数中选出最多个数异或和为0的更多相关文章

  1. 一道经典的面试题:如何从N个数中选出最大(小)的n个数

    转载:https://zhidao.baidu.com/question/1893908497885440140.html 这个问题我前前后后考虑了有快一年了,也和不少人讨论过.据我得到的消息,Goo ...

  2. JAVA 递归实现从n个数中选取m个数的所有组合

    这周Java课程有个小作业:Java递归实现从n个数中选取m个数的所有组合 代码如下: //其中 n 取 1,2,3,4,5 五个数, m 取 3 package javaText; public c ...

  3. C++从多n个数中选取m个数的组合

    //start 是从哪个开始取, picked代表已经取了多少个数 //process和data是全局变量数组 //语言说明比较难,我举个例子吧 //从[ 1, 2, 3, 4 ]中选取 2 个数 / ...

  4. Poj The xor-longest Path 经典题 Trie求n个数中任意两个异或最大值

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5646   Accepted: 1226 Description In an ...

  5. 找出n个数中重复最多的10个数

    题目很清晰,直接上python代码 import pandas as pd import copy class BenchMark: def __init__(self): self.MIN = 10 ...

  6. hdu 5265 技巧题 O(nlogn)求n个数中两数相加取模的最大值

    pog loves szh II Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  7. SGU 275 To xor or not to xor 高斯消元求N个数中选择任意数XORmax

    275. To xor or not to xor   The sequence of non-negative integers A1, A2, ..., AN is given. You are ...

  8. 从1到n整数中1的个数

    [问题]求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.A ...

  9. LA2965侏罗纪(异或和为0的最大数字个数)

    题意:       给你n个字符串,让你在里面找到一个字符串集合使得这些字符串中所有的字母出现的次数和为偶数,输出集合的最大个数,和ASCII最小的解. 思路:       考虑到每个字符串中所有的字 ...

随机推荐

  1. AnimatorController动画遮罩

    游戏中,我们的人物在某些时候,可能在一个时间点在做两件事,这样就需要同时播放两个动画,但我们肯定不能简单将其叠加,比如移动着开枪.攻击.挥手等等,那么在Unity中我们应该怎样实现这样的功能呢?且听我 ...

  2. Unity5系列资源管理AssetBundle——加载

    上次我们进行了AssetBundle打包,现在我们还把打包的资源加载到我们的游戏中.在加载之前,我们需要把打包好的Bundle包裹放到服务器上,如果没有,也可以使用XAMPP搭建本地服务器. 加载的A ...

  3. MySQL日志Undo&Redo

    00 – Undo LogUndo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版本并发控制(简称:MVCC). - 事务的原子性(Atomi ...

  4. ESFramework 4.0 快速上手(06) -- Rapid引擎(续)

    <ESFramework 4.0 快速上手>系列介绍的都是如何使用Rapid引擎(快速引擎) -- RapidServerEngine 和 RapidPassiveEngine.其实,大家 ...

  5. hitTest:withEvent:方法流程

    此方法可实现点击穿透.点击下层视图功能. 一. hitTest:withEvent:调用过程 iOS系统检测到手指触摸(Touch)操作时会将其放入当前活动Application的事件队列,UIApp ...

  6. 写一个CGI程序并运行

    准备Linux和Apache我在/var/www/cgi-bin/下建一个文件get.c #include <stdio.h> #include <stdlib.h> int ...

  7. c/c++ 浮点型处理

    #include <stdio.h> #include <iostream> #include <string> #include <string.h> ...

  8. 移动前端不得不了解的HTML5 head 头标签(中上篇)

    Meta 标签 meta标签是HTML中head头部的一个辅助性标签,它位于HTML文档头部的 <head> 和 <title> 标记之间,它提供用户不可见的信息.虽然这部分信 ...

  9. iOS的一些关键字

    最近在使用Swift的过程中,感觉到苹果公司为了迎合Swift,在Objective-C中添加了许多关键字.这些关键字一般用来用来修饰属性,或者方法的参数以及方法的返回值等等.而在以前的Objecti ...

  10. 学习multiprocessing

    1. multiprocessing.Pool from multiprocessing.pool import Pool def gen_row(): ...return rows def main ...