zoukankan      html  css  js  c++  java
  • HDU-5269 ZYB loves Xor I

    题目大意:

    给出一个长度为n的数组A,让你求出lowbit(A[i]^A[j])的和对998244353取模的结果,其中i和j都属于[1,n]。lowbit(x)表示的是满足x xor 2^k > 0最小的2^k

    解题思路:

    因为数据规模很明显是5e4这样的规模,直接暴力搞必然超时,那么我们可以考虑一个问题,对于异或,如果x xor 2^k > 0的话,k一定是x二进制表示中最小的一位为1的数。

    知道了这个还是无法求出来这个问题。因为涉及到异或问题,所以我们很容易想到字典树,字典树第h层的左子树表示数据自右向左第h位为0的,右子树表示第h位为1。

    而这两个如果同时存在,那么这两个节点当前能表示的数的个数的乘积乘以1 << h就是这两个节点能表示的数的lowbit值。

    最后答案乘以2即可。

    代码:

    #include <cstring>
    #include <iostream>
    using namespace std;
    
    typedef struct node {
    	int val;
    	int nxt[2];
    }Trie;
    
    const int maxn = 50005;
    const int mod = 998244353;
    
    int tot;
    Trie t[maxn * 30];
    
    void Insert(int x) {
    	int tmp, p = 0;
    	for (int i = 0; i < 30; ++i) {
    		if (x & (1 << i)) tmp = 1;
    		else tmp = 0;
    		if (!t[p].nxt[tmp]) {
    			t[tot].val = t[tot].nxt[0] = t[tot].nxt[1] = 0;
    			t[p].nxt[tmp] = tot++;
    		}
    		p = t[p].nxt[tmp];
    		++t[p].val;
    	}
    }
    int query(int p, int h) {
    	int lef = t[p].nxt[0];
    	int rig = t[p].nxt[1];
    	long long tmp = (((long long)t[lef].val * (long long)t[rig].val) % mod * (1 << h)) % mod;
    	if (lef) tmp = (tmp + query(lef, h + 1)) % mod;
    	if (rig) tmp = (tmp + query(rig, h + 1)) % mod;
    	return tmp;
    }
    int main() {
    	ios::sync_with_stdio(false); cin.tie(0);
    	int n, x, T; cin >> T;
    	for (int cas = 1; cas <= T; ++cas) {
    		cin >> n; tot = 1;
    		t[0].val = t[0].nxt[0] = t[0].nxt[1] = 0;
    		for (int i = 0; i < n; ++i) {
    			cin >> x;
    			Insert(x);
    		}
    		long long ans = query(0, 0);
    		ans = (2 * ans) % mod;
    		cout << "Case #" << cas << ": " << ans << endl;
    	}
    	return 0;
    }


  • 相关阅读:
    [Linux系统] (3)应用安装方式详解(编译安装、rpm包安装、yum安装)
    [Linux系统] (2)用户权限管理
    jQuery.Validate验证库详解
    jQuery Ajax 实例 ($.ajax、$.post、$.get)
    原生js记住密码
    静态网站公用的部分模块的引用(设置)方法
    针对特定浏览器起作用的CSS: IE Chrome Firefox CSS Hack
    HTML5 video 视频标签全属性详解
    js for循环,为什么一定要加var定义i变量
    用谷歌浏览器来当手机模拟器
  • 原文地址:https://www.cnblogs.com/wiklvrain/p/8179372.html
Copyright © 2011-2022 走看看