题意:

      给你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. C++入门(3):C++开发环境搭建

    本文首发 | 公众号:lunvey 既然开始学C++,电脑上应该具备它的开发环境. 而C++历史,lunvey老师觉得:初学者有兴趣可以自行了解一下,不是必要的. 大家都在用最新款的苹果手机,好用就行 ...

  2. Centos7网络配置——设置固定ip

    有段时间没有用虚拟机了,这几天翻出了以前的虚拟机,写几个demo,但遇到了一个让人难受的问题.使用xshell远程连接虚拟机,命令还没敲几个,不到一分钟就自动断开了,只能重新再次连接.啥事都干不成,有 ...

  3. Java 语言基础 01

    语言基础·一级 什么是计算机? 计算机(Computer)全称:电子计算机,俗称电脑.是一种能够按照程序运行,自动.高速处理海量数据的现代化智能电子设备.由硬件和软件所组成,没有安装任何软件的计算机称 ...

  4. IntelliJ-IDEA 打包代码报错

    一.问题由来 使用 IntelliJ-IDEA 打包项目一直以来都没问题,可是上周的时候,突然打包就报错了,并且Maven中的pom.xml文件确定是没有改过,打包的配置文件也没有修改过. 报错信息如 ...

  5. AtCoder Beginner Contest 192

    A Star #include <cstdio> using namespace std; int n; int main() { scanf("%d", &n ...

  6. C# 应用 - 封装类访问 Oracle 数据库

    1. 引入库类 Oracle.ManagedDataAccess.dll using Oracle.ManagedDataAccess.Client; 2. 粗暴封装 namespace xx { p ...

  7. (Java基础--Spring阶段)常见面试题题目及解析整理(2021.03.12)

    题目整理 Java基础进阶阶段 基础概念类 1.JDK1.8新特性? 2.面向对象和面向过程的区别? 3.什么是值传递和引用传递? 4.什么是不可变对象? 5.讲讲类的实例化顺序? 6.java 创建 ...

  8. P3388 【模板】割点(割顶) 题解 (Tarjan)

    题目链接 P3388 [模板]割点(割顶) 解题思路 最近学的东西太杂了,多写点博客免得自己糊里糊涂的过去了. 这个题求割点,感觉这篇文章写得挺好. 割点是啥?如果去掉这个点之后连通图变成多个不连通图 ...

  9. BuaacodingT141 microhhh的回城 题解(模拟)

    题目链接 microhhh的回城 解题思路 这题挺有意思的.本来寻思放在\(DS\)第一次练习赛应该不会很难吧,结果愣是卡在数据范围上写不出来. 然后暴力过掉了,但是用了\(1019ms\).感觉可以 ...

  10. JVM笔记 -- 来,教你类加载子系统

    类加载子系统 类文件首先需要经过类加载子系统,进行加载,进类信息等加载到运行时数据区,生成Klass的实例. 在类加载子系统中有以下3个阶段操作(广义上的加载): 加载阶段 Bootstrap Cla ...