题意:

      给你n个字符串,让你在里面找到一个字符串集合使得这些字符串中所有的字母出现的次数和为偶数,输出集合的最大个数,和ASCII最小的解。

思路:

      考虑到每个字符串中所有的字符都是有大写字母组成的,我们可以把每个字符串都用一个26位长的二进制数表示,比如第一位表示A,那么当第一位为0的时候就是说明A出现了偶数次,1表示出现了奇数次(直接异或),那么我们要找到满足题意的集合也就是可以转化成我们在n个26位长的二进制数中找到最多的数字,使得他们异或一起最后等于0(等于0表示所有的字母都是偶数次),这样我们有两种方式,一种是我自己写的暴搜,时间复杂度O(2^n)没有超时,如果是要完全的暴力建议去写搜索,不要写for循环枚举,因为for的枚举在判断的时候时间复杂度还要*n,这样估计就超时了,写搜索可以在状态转换的时候把值算出来,这样最后的时候不用可以去算什么,直接if判断,减少了一个n,时间复杂度应该是妥妥的O(2^n),还有就是再说下白书上的方法,用的是中途相遇法,这个方法感觉很好,让我想起了双向广搜,这个题目我想是不是应该叫双向深搜,大体思路就是把要枚举的东西分成两部分分别枚举,然后在结合一起去判断,时间复杂度可以降低不少,白书给的时间复杂度我感觉算的有问题,我算的是O(1.44^n*n/2),两个方法我都试了,中途相遇法的时间复杂度优化了很多,下面是两个方法的AC代码。

直接暴力深搜 时间复杂度

O(2^n)  runtime  2.292 

#include<map>

#include<string>

#include<stdio.h>

#include<string.h>

using namespace std;

int num[30];

char str[1100];

int Ans ,Anszt;

void DFS(int nowid ,int nows ,int nownum ,int nowzt)

{

   if(nowid == 0)

   {

      if(nownum == 0)

      {

         if(Ans <= nows)

         {

            Ans = nows;

            Anszt = nowzt;

         }

      }

      return ;

   }

   DFS(nowid - 1 ,nows ,nownum ,nowzt * 2);

   DFS(nowid - 1 ,nows + 1 ,nownum ^ num[nowid] ,nowzt * 2 + 1);

}

int main ()

{

   int n ,i ,j ,now;

   while(~scanf("%d" ,&n))

   {

      for(i = 1 ;i <= n ;i ++)

      {

         scanf("%s" ,str);

         now = 0;

         int l = strlen(str) - 1;

         for(j = 0 ;j <= l ;j ++)

         now = now ^ (1 << (str[j] - 'A'));

         num[i] = now;

      }

      Ans = Anszt = 0;

      DFS(n ,0 ,0 ,0);

      printf("%d\n" ,Ans);

      int nowid = 1 ,mk = 0;

      while(Anszt)

      {

         if(Anszt&1) 

         {

            if(mk) printf(" %d" ,nowid);

            else printf("%d" ,nowid);

            mk = 1;

         }

         Anszt /= 2;

         nowid ++;

      }

      printf("\n");

   }

   return 0;

}

   

中途相遇法  时间复杂度

O(2^(n/2)*n/2) => 1.44^n*n/2  runtime 0.029

#include<map>

#include<string>

#include<stdio.h>

#include<string.h>

using namespace std;

map<int ,int>mark;

int num[30];

char str[1100];

int bitcount(int x)

{

   return x == 0 ? 0 : bitcount(x / 2) + (x & 1);

} 

int main ()

{

   int n ,i ,j ,now ,l;

   while(~scanf("%d" ,&n))

   {

      for(i = 1 ;i <= n ;i ++)

      {

         scanf("%s" ,str);

         now = 0 ,l = strlen(str) - 1;

         for(j = 0 ;j <= l ;j ++)

         now = now ^ (1 << (str[j] - 'A'));

         num[i] = now;

      }

      mark.clear();

      int n1 = n / 2;

      int n2 = n - n1;

      for(i = 0 ;i < (1 << n1) ;i ++)

      {

         int x = 0;

         for(j = 1 ;j <= n1 ;j ++)

         if(i & (1 << (j-1))) x ^= num[j];

         if(!mark.count(x) || bitcount(i) > bitcount(mark[x]))

         mark[x] = i;

      }

      int Ans = 0;

      for(i = 0 ;i < (1<<n2) ;i ++)

      {

         int x = 0;

         for(j = 1 ;j <= n2 ;j ++)

         if(i & (1 << (j-1))) x ^= num[n1 + j];

         if(mark.count(x) && bitcount(i) + bitcount(mark[x]) > bitcount(Ans))

         Ans = (i << n1) ^ mark[x];

      }

      printf("%d\n" ,bitcount(Ans));

      int mk = 0,Anszt = Ans ,nowid = 1;

      while(Anszt)

      {

         if(Anszt&1) 

         {

            if(mk) printf(" %d" ,nowid);

            else printf("%d" ,nowid);

            mk = 1;

         }

         Anszt /= 2;

         nowid ++;

      }

      printf("\n");

      

         

   }

   return 0;

}

      

         

      

LA2965侏罗纪(异或和为0的最大数字个数)的更多相关文章

  1. LA2965 n个数中选出最多个数异或和为0

    intput n 1<=n<=24 n串只有大写字母的字符串 output 选出最多个字符串且每个大写字母出现的次数为偶数 第一行输出个数x 第二行输出x个字符串的下标 做法:将每个字符串 ...

  2. 0..n去掉一个数,给你剩下的数,找出去掉的那个数

    转载请注明转自blog.csdn.net/souldak , 微博@evagle 首先,考虑没有去掉那些数,如果n是奇数,n+1个最低位肯定是0101...01,count(0)=count(1),如 ...

  3. 在0~N个数字中,取指定个数的不重复数字,要求这些数字的和为指定值,求所有结果

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...

  4. TabIndex 属性 Tabindex="-1" 与Tabindex="0"、任意数字 (收录)

    TabIndex 属性 Tabindex="-1" 与Tabindex="0".任意数字 html中的tabIndex属性可以设置键盘中的TAB键在控件中的移动 ...

  5. GridView导出成Excel字符"0"丢失/数字丢失的处理方式 收藏

    GridView导出成Excel字符"0"丢失/数字丢失的处理方式 收藏 GridView 导出成Excel文件,这个代码在网上比较多.但是发现存在一个问题,导出的数据中如果有&q ...

  6. 获取数组中多个相加等于0的一组数字 javascript

    //获取数组中两个相加等于0的一对数字,比如[ [ -10, 10 ], [ -5, 5 ] ] var arr=[-5,10,1,-10,3,4,5,9] //对数组进行排序 arr.sort(fu ...

  7. Easyui的numberbox无法输入以0开头的数字编号(转载)

    1.问题 项目中碰到这样一个问题,Easyui的numberbox在输入数字编号的时候不能以0开头 在我输入以0开头的数字编号后,离开输入框的时候,那个前缀0就自动去掉了. 接下来,我们查看API说明 ...

  8. x^a=b(mod c)求解x在[0,c-1]上解的个数模板+原根求法

    /************************************* 求解x^a=b(mod c) x在[0,c-1]上解的个数模板 输入:1e9>=a,b>=1,1e9>= ...

  9. python计算1~2008中0和1的个数

    计算1~2008中所有自然数中1和0的个数总数. 通过自然数的大小划分区间,将自然数每位上的数载入列表,循环计数. list = [] onecount = 0 zerocount = 0 for i ...

随机推荐

  1. 剑指 Offer 56 - I. 数组中数字出现的次数 + 分组异或

    剑指 Offer 56 - I. 数组中数字出现的次数 Offer_56_1 题目描述 解题思路 java代码 /** * 方法一:数位方法 */ class Offer_56_1_2 { publi ...

  2. 在onBackPress中实现退出拦截时不生效

    现象描述 在快应用中弹出一个弹窗,期望效果是该弹窗在用户确认后再退出,但是使用onbackpress控制确认弹窗后自动退出不生效. 问题分析 快应用引擎实现机制决定了onbackpress不能有耗时的 ...

  3. 测试工程师Docker基础

    一.docker概述 1.docker为什么会出现 本质:所有技术的出现都是因为出现了一些问题,我们需要去解决,才去研究和学习: 问题: ​ 开发环境.测试环境.仿真环境.正式环境等诸多环境都需要进行 ...

  4. 在linux系统中登录mysql时出现Enter password: ERROR 1045 (28000): Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)的解决办法

    在一次使用mysql数据库是出现了这种错误,于是乎去百度看了很多博文踩了很多坑,最终解决了问题,分享给大家. 转载与:https://blog.csdn.net/css33/article/detai ...

  5. 解决linux sudo apt-get install xx是2出现无法定位软件包方法

    解决办法: 在etc/apt/sources.list最后一行添加 deb http://archive.ubuntu.com/ubuntu/ trusty main universe restric ...

  6. 【LeetCode】4. Median of Two Sorted Arrays(思维)

    [题意] 给两个有序数组,寻找两个数组组成后的中位数,要求时间复杂度为O(log(n+m)). [题解] 感觉这道题想法非常妙!! 假定原数组为a,b,数组长度为lena,lenb. 那么中位数一定是 ...

  7. IdentityServer4是什么

    1 什么是IdentityServer4? IdentityServer4是用于ASP.NET Core的OpenID Connect和OAuth 2.0框架. 2 什么是OAuth 2.0? OAu ...

  8. Hibernate的Dao层通用设计

    hibernate作为一款优秀的数据库持久化框架,在现实的运用中是非常广泛的.它的出现让不熟悉sql语法的程序员能开发数据库连接层成为一种可能,但是理想与现实永远是有差距的.开发过程中如果只使用hql ...

  9. python基础之流程控制(2)

    今天将是基础篇的最后一篇,咱们来补上最后一个内容,流程控制for循环 For 循环 一.为什么有for循环? for循环能做的事情,while循环全都可以实现,但是在某些情境下,for循环相对于whi ...

  10. [Fundamental of Power Electronics]-PART I-5.不连续导电模式-5.2 变比M分析

    5.2 变比M分析 经过一些改进,第二章中的用于CCM稳态分析的相同技术和近似方法可以应用于DCM. (a)电感伏秒平衡.电感电压直流分量必须为0: \[<v_{L}>=\frac{1}{ ...