S的T2过了,这题没过求调
查看原帖
S的T2过了,这题没过求调
218530
BoAn楼主2023/10/24 19:22
#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
const int MAX=2e6+5,P=1145141919810;
int t,n,b[MAX],a[MAX],q[MAX];
map<pair<int,int>,int>h;
signed main(){
	srand((unsigned)time(0));
	cin>>t;
	while(t--){
		cin>>n;
		for(int i=1;i<=n;i++)b[i]=rand()%P+1;
		for(int i=1;i<=n;i++)cin>>a[i];
		int ans=0,x1=a[1],x2=a[1],top=1;
		q[1]=a[1],h[make_pair(x1,x2)]=1,h[make_pair(0,0)]=1;
		for(int i=1;i<=n;i++){
			if(q[top]==a[i]){
				x1^=(a[i]*b[top]);
				x2-=a[i]^b[top];
				top--;
			}
			else {
				q[++top]=a[i];
				x1^=(a[i]*b[top]);
				x2+=a[i]^b[top];
			}
			ans+=h[make_pair(x1,x2)];
			h[make_pair(x1,x2)]++;
		}
		cout<<ans<<endl;
	}
	return 0;
}

第二篇题解的思路,照搬哈希方法(自己写的哈希挂飞了qwq)

2023/10/24 19:22
加载中...