zoukankan      html  css  js  c++  java
  • 折半搜索

    异或和

    题目描述

    有一个长度为n的数列,请你编程求出是否有有若干个数字的异或和为0

    输入及输出格式

    输入共两行,第一行为n,第二行有n个数,即题意中的数列
    输出仅一行,若有异或和为0的情况,输出“Ye5”,否则输出“No”(不带引号)

    样例

    输入

    3

    1 2 3

    输出

    Ye5

    数据范围

    50%的数据满足n<=20

    100%的数据满足n<=40


    对于这个题,我们首先想到的就是暴力,暴力搜索。

    可是根据数据范围来看,如果暴力搜索的话,时间复杂度是O(2^N)的级别。只能拿到50~60分

    那么作为一个oier,相信都不陌生的是O(2n/2+2n/2)的复杂度肯定是比O(2^N)快的。

    这就启示我们,可以将40个数分成20+20个数

    这样,就将240方变为220次方,大大缩短了用时

    #include<iostream>
    #include<cstdio> 
    using namespace std;
    int in[41];
    int n;
    int mid;
    bool reach[500000];
    void dfs1(int num,int now)
    {
    	if(now==mid+1)
    		return;
    	dfs1(num,now+1);
    	reach[num^in[now]]=true;
    	dfs1(num^in[now],now+1);
    }
    bool broke=false;
    bool dfs2(int num,int now)
    {
    	if(broke)
    		return broke;
    	if(now==n+1)
    		return false;
    	dfs2(num,now+1);
    	if(reach[num^in[now]])
    		return broke=true;
    	reach[num^in[now]]=true;
    	dfs2(num^in[now],now+1);
    }
    int main()
    {
    	cin>>n;
    	mid=n/2;
    	for(int i=1;i<=n;i++)
    		cin>>in[i];
    	dfs1(0,1);
    	if(dfs2(0,mid+1))
    		printf("Ye5");
    	else
    		printf("No");
    	return 0;
    }
    
  • 相关阅读:
    Java-GZIPOutputStream踩坑
    Redis事务
    Netty实现简单群聊
    SpringMVC请求参数解析
    Netty实现WebSocket
    SpringBoot项目war包部署
    NIO实现群聊
    SpringMVC请求映射handler源码解读
    SpringMVC自定义兼容性HandlerMapping
    spring boot自定义类配置绑定在配置文件中自动提示
  • 原文地址:https://www.cnblogs.com/Lance1ot/p/8494583.html
Copyright © 2011-2022 走看看