• 计数区间异或为0(不可交)


    https://www.cnblogs.com/Harley-Quinn/p/7513052.html

    题意:给一组数n,求区间异或和为0且任意区间不交的数量

    解法:贪心两区间都为0选右边界小的区间,会使得答案更优

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    int a[100009];
    int cnt = 0 ;
    
    void work(int a[] , int n){
        vector<int>v;
        v.reserve(n);
        int low = 0 ;//左边界
    
        for(int i = 0 ; i < n ; i++)//右边界
        {
            v.clear();
            v.push_back(a[i]);
            for(int j = i-1 ; j >= low ; j--)
            {
                v.push_back(v.back()^a[j]);//以i为右边界low为左边的所有区间异或和存入数组v
            }
            if(find(v.begin() , v.end() , 0) != v.end())//查找区间异或为0
            {
                low = i+1 ;//更新左边界。
                cnt++;
            }
        }
    }
    
    int main()
    {
        int n;
        scanf("%d" , &n);
        for(int i = 0 ; i < n ; i++)
        {
            scanf("%d" , &a[i]);
        }
        work(a , n);
        cout << cnt << endl;
        return 0;
    }
    
  • 相关阅读:
    jq原创幻灯片插件slideV1.0
    jq原创弹出层折叠效果
    jq实现鼠标经过图片翻滚效果
    开源代码的来源
    名词解析
    Joomla软件的简单介绍
    Java集合类的使用
    笔记
    MySQL基础篇一
    MySQL基础篇一
  • 原文地址:https://www.cnblogs.com/nonames/p/12297619.html
Copyright © 2020-2023  润新知