首页 > 其他分享 >Hash表板子

Hash表板子

时间:2022-11-06 15:44:14浏览次数:58  
标签:Hash int big ll long 板子 异或 区间

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
ull rx=1e9+7;
ll rand(ll x,ll y){rx*=998244353;return rx%(y-x+1)+x;}
const int M=1e6+5,N=2e5+5;
ll rv[M],a[N],s[N];
int n,la[N],ed[M];
namespace fk{
	const int big=400,C=N/big+5,M=20007;
	int id[N],tot,l[C],r[C];
	ll v[N],lz[C];
	struct node{
		int head[M],d[big+5],d0;
		int nxt[big+5],cnt[big+5],num;
		ll h[big+5];
		void init(){
			for(int i=1;i<=num;i++)cnt[i]=0;
			for(int i=1;i<=d0;i++)head[d[i]]=0;
			num=d0=0;
		}
		int&operator[](ll n){
			int y=n%M;
			for(int p=head[y];p;p=nxt[p])
				if(h[p]==n)return cnt[p];
			if(head[y]==0)d[++d0]=y;
			nxt[++num]=head[y];head[y]=num;h[num]=n;
			return cnt[num];
		}
		int find(ll n){
			int y=n%M;
			for(int p=head[y];p;p=nxt[p])
				if(h[p]==n)return cnt[p];
			return 0;
		}
	}c[C];
	void make(int x){
		c[x].init();
		for(int i=l[x];i<=r[x];i++)c[x][v[i]]++;
	}
	void build(){
		for(int i=1;i<=n;i++){
			if(i%big==1)l[++tot]=i;
			id[i]=tot;r[tot]=i;
		}
		for(int i=1;i<=n;i++)v[i]=s[i-1];
		for(int i=1;i<=tot;i++)make(i);
	}
	void cha_b(int x,int y,ll z){
		for(int i=x;i<=y;i++)v[i]^=z;
		make(id[x]);
	}
	void change(int x,int y,ll z){
		if(id[x]==id[y])return cha_b(x,y,z);
		cha_b(x,r[id[x]],z);cha_b(l[id[y]],y,z);
		for(int i=id[x]+1;i<=id[y]-1;i++)lz[i]^=z;
	}
	int qry_b(int x,int y,ll z){
		z^=lz[id[x]];int s=0;
		for(int i=x;i<=y;i++)s+=(z==v[i]);
		return s;
	}
	int ask(int x,int y,ll z){
		if(id[x]==id[y])return qry_b(x,y,z);
		int s=qry_b(x,r[id[x]],z)+qry_b(l[id[y]],y,z);
		for(int i=id[x]+1;i<=id[y]-1;i++)s+=c[i].find(z^lz[i]);
		return s;
	}
}
int main(){
	freopen("odd.in","r",stdin);
	freopen("odd.out","w",stdout);
	for(int i=0;i<=1e6;i++)rv[i]=rand(1,1ll<<60);
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		la[i]=ed[a[i]];ed[a[i]]=i;
		a[i]=rv[a[i]];s[i]=s[i-1]^a[i];
	}
	fk::build();
	ll ans=0;
	for(int i=1;i<=n;i++){
		fk::change(la[i]+1,i,a[i]);
		ans+=fk::ask(1,i,s[i]);
	}
	printf("%lld\n", ans);
}

/*
大致思路:
考场差点就会了,我好菜啊
考虑给每个点一个权值,然后我们统计一个前缀异或和
那么一个区间[l,r]满足条件当且仅当s[r]^s[l-1]=(在这个区间中出现的过的数的权值的异或和)
将后面那个东西设为p[i]
考虑移动右端点r,对于每个左端点维护s[l-1]p[l],然后直接查询满足s[r]=s[l-1]p[l]的l的个数即可
s[l-1]直接初始赋上,然后对于一个新的r
它会对pre[r]+1~r这段区间的p[i]造成一个a[r]的贡献,其中pre[i]是a[r]上一次出现的位置
这东西是个区间异或,考虑用分块维护
直接用map求出现次数会T,每个块都维护一个hash表
*/

标签:Hash,int,big,ll,long,板子,异或,区间
From: https://www.cnblogs.com/CHK666/p/16862718.html

相关文章

  • Java的HashSet和HashMap性能选项
    Java的HashSet和HashMap性能选项1.*HashSet和HashMap的性能选项对于HashSet及其子类而言,它们采用hash算法来决定集合中元素的存储位置,并通过hash算法来控制集合的大小;对......
  • 数学 动规 滑动窗口 HashMap里放数组 dfs 暴力
    1比特与2比特字符intn=bits.length;inti=0;因为,如果最后一个字符必须是一个一比特字符,那么,一定可以跳到最会一个位置。也就是n-1这个位置。所以不能遍......
  • MurmurHash64B
    unsignedlonglongMurmurHash64B(constvoid*key,intlen,unsignedintseed){ constunsignedintm=0x5bd1e995; constintr=24; unsignedinth1=seed......
  • JAVA并发容器-ConcurrentHashMap 1.7和1.8 源码解析
    HashMap是一个线程不安全的类,在并发情况下会产生很多问题,详情可以参考​​HashMap源码解析​​;HashTable是线程安全的类,但是它使用的是synchronized来保证线程安全,线程竞争......
  • HashMap 源码解析
    源码学习,边看源码边加注释,边debug,边理解。基本属性常量DEFAULT_INITIAL_CAPACITY:默认数组的初始容量-必须是2的幂。MAXIMUM_CAPACITY:数组的最大容量DEFAULT_LOAD_FACTOR:哈......
  • Guava中常用Object方法-equals与null比较、hashCode、自定义toString、自定义compareT
    场景Java核心工具库Guava介绍以及Optional和Preconditions使用进行非空和数据校验:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/127683387在上面引入Gua......
  • HDU 1686Oulipo ———————Hash or KMP
    OulipoOulipoTimeLimit:3000/1000MS(Java/Others)    MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):22302    AcceptedSubmission(s):86......
  • java中的equals工具包和hashcode
    packagecom.te.jdkapi;importcom.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;importjava.util.Objects;/*学习equals的方法*/publicclassStudy_Equels......
  • JAVA++:HashMap无序?TreeMap有序?
    书上说HashMap是无序的,TreeMap是有序的(有序无序是针对key的),但是实际去敲的时候发现不是这样,有时HashMap是有序的,有时TreeMap是无序的。于是就做了以下测试来探究:......
  • TreeMap,HashMap,LinkedHashMap区别
    TreeMap,HashMap,LinkedHashMap之间的区别和TreeSet,HashSet,LinkedHashSet之间的区别相似。TreeMap:内部排序,内部使用了红黑树排序HashMap:无序。LinkedHashMap:顺序存取,内部......