首页 > 其他分享 >【XOR-HASHING】CF1175F

【XOR-HASHING】CF1175F

时间:2023-08-09 09:55:30浏览次数:30  
标签:XOR CF1175F int rep long rd prv base HASHING

XOR-HASHING

一眼典。

考虑对于每个数随一个 long long 的权值。

那么就可以有 \(prx_r \oplus prv_{l - 1} = base_{r - l + 1}\)。

这个很难直接计数,考虑增强条件。那么就是这个段一定包含 1。
那么就是很典的问题了,问多少个包含 1 的段满足上面那个柿子。
然后考虑前驱后驱间形成的段,进行枚举即可。这里用了 reverse 实现。

#include <bits/stdc++.h>
#include <ctime>
#define rep(i, l, r) for (int i = l; i <= r; i ++)
#define per(i, r, l) for (int i = r; i >= l; i --)
#define cpy(x, y, s) memcpy(x, y, sizeof(x[0]) * (s))
#define mem(x, k) memset(x, k, sizoef(k))
#define int long long

// \yhx-12243/ 鱼大保佑!!

using namespace std;

const int _ = 3e5 + 5;
int n, a[_], rd[_], prv[_], base[_], ans;

mt19937_64 rnd(time(0));
signed main () {
	ios :: sync_with_stdio(0);
	cin >> n;
	rep(i, 1, n) {
		cin >> a[i];
		rd[i] = rnd();
		base[i] = base[i - 1] ^ rd[i];

	}
	rep(i, 1, n) prv[i] = prv[i - 1] ^ rd[a[i]];
	for (int i = 1, j = 1; i <= n; i ++) {
		if (a[i] == 1) { j = 1; ans ++; }
		else {
			j = max(j, a[i]);
			if (i >= j && (prv[i] ^ prv[i - j]) == base[j])
				ans ++;
		}
	}
	reverse(a + 1, a + 1 + n);
	rep(i, 1, n) prv[i] = rd[a[i]] ^ prv[i - 1];
	for (int i = 1, j = 1; i <= n; i ++) {
		if (a[i] == 1) { j = 1; }
		else {
			j = max(j, a[i]);
			if (i >= j && (prv[i] ^ prv[i - j]) == base[j])
				ans ++;
		}
	}
	cout << ans;
	return 0;
}
/*8
  2 4 1 3 4 2 1 2*/

正儿八经做法。

考虑枚举最大值,然后直接照搬 beautiful-segment。

启发式合并,选小的那一侧,然后询问右边是否前缀有同色即可。后者是可以是可以 ST 维护前驱的,查询区间 max 即可。

时间复杂度 \(O(n \log n)\)。

标签:XOR,CF1175F,int,rep,long,rd,prv,base,HASHING
From: https://www.cnblogs.com/Custlo/p/17616096.html

相关文章

  • 汇编-xor异或
     XOR指令在两个操作数的对应位之间进行(按位)逻辑异或(XOR)操作如果两个位值相同(同为0或同为1),则结果位等于0;否则结果位等于1【相同为0,不同为1】      ......
  • 关于 x11 xorg wayland 的区别
           ......
  • 白话解析:一致性哈希算法 consistent hashing
    在了解一致性哈希算法之前,最好先了解一下缓存中的一个应用场景,了解了这个应用场景之后,再来理解一致性哈希算法,就容易多了,也更能体现出一致性哈希算法的优点,那么,我们先来描述一下这个经典的分布式缓存的应用场景。场景描述假设,我们有三台缓存服务器,用于缓存图片,我们为这三台......
  • XorDistances
    [ABC202E]CountDescendants考虑一个判断某个点\(v\)是否为另一个点\(u\)后代的方法:令\(dfn_v\)表示\(v\)的\(dfs\)序,令\(out_u\)表示离开\(u\)的子树时的最新的\(dfs\)序,由于一个子树内的\(dfs\)序是连续的,所以只要\(dfn_u\ledfn_v\leout_u\)。考虑将深......
  • XorDistances
    [ABC201E]XorDistances首先,根据\(a\oplusa=0\),一条路径\(dis(u,v)=(dis(1,\text{LCA})\oplusdis(1,u))\oplus(dis(1,\text{LCA})\oplusdis(1,v))\),消去相同的,得\(dis(1,u)\oplusdis(1,v)\)。预处理从\(1\)到每个点的前缀异或,问题被转换成从\(n\)个数中选两个两两异......
  • [CF1849F] XOR Partition
    XORPartition题目描述Forasetofintegers$S$,let'sdefineitscostastheminimumvalueof$x\oplusy$amongallpairsofdifferentintegersfromtheset(here,$\oplus$denotesbitwiseXOR).Iftherearelessthantwoelementsintheset,......
  • HDU−4825 XorSum
    01trie树定义:将整数转化为二进制再插入trie树,通常是从高位到低位插入trie。使用场景:寻找与异或相关的结果题目背景:Zeus和Prometheus做了一个游戏,Prometheus给Zeus一个集合,集合中包含了N个正整数,随后Prometheus将向Zeus发起M次询问,每次询问中包含一个正整数S,之后......
  • [ABC308G] Minimum Xor Pair Query 题解
    MinimumXorPairQuery题目大意维护一个序列,支持动态插入,删除,查询最小异或对。思路分析看到查询最小异或对首先想到01Trie,但01Trie不支持删除,考虑暴力套一个线段树分治。需要预处理出每个元素的存活区间,这里使用了map<int,vector<int>>。注意,有的元素会存活到最后,需要特......
  • [ABC308G]MinimumXorPairQuery
    [ABC308G]MinimumXorPairQuery必须知道的性质:对于三个非负整数\(x,y,z(x<y<z)\),有\(\min(x\bigoplusy,y\bigoplusz)<x\bigoplusz\)。证明从二进制最高位开始\(i=\logV\),对\(x,y,z\)进行如下操作:若它们的当前位都两两相同,继续跳到下一位i--。根据......
  • 【大联盟】20230707 xor(xor) CF1456E 【XOR-ranges】
    就我不会*3500/kel题目描述here。题解做法考虑从高位往低位处理,由于有限制的数它的值数确定的,没限制的数值不需要管,因为肯定可以是答案为\(0\)。所以我们考虑区间DP,我们令\(f_{i,l,r,0/1,0/1}\)表示从高往低到第\(i\)位,最左侧\(l\)还有限制,第一个\(0/1\)表示\(x......