RT,写了个启发式合并维护哈希被卡了,不知道是不是哈希的问题?
#include <bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define int long long
const int MAXN=100005,F1=1e18,F2=1e9;
int mod[]={0,F1+7,F1+9,F1-7,F2+7,998244353},mul[]={0,F2+9,F2+7,19260817,114513,1919809},k=5;
int val[6][MAXN];
set<pii> s[MAXN];
void merge(int x,int y){
for(set<pii>::iterator it=s[x].begin();it!=s[x].end();it++){
set<pii>::iterator jt=s[y].lower_bound(make_pair(it->first,0));
int cnt;
if(jt==s[y].end() || jt->first!=it->first) cnt=0;
else cnt=jt->second,s[y].erase(jt);
s[y].insert(make_pair(it->first,cnt+(it->second)));
}
for(int i=1;i<=k;i++) val[i][y]=0;
for(set<pii>::iterator it=s[y].begin();it!=s[y].end();it++){
for(int i=1;i<=k;i++) val[i][y]=(1ll*val[i][y]*mul[i]%mod[i]+1ll*(it->first)*(it->second)%mod[i])%mod[i];
}
s[x].clear();
}
signed main(){
int n,m,q; read(n,q);
for(int i=1;i<=n;i++){
read(m);
for(int x,j=1;j<=m;j++){
read(x);
set<pii>::iterator it=s[i].lower_bound(make_pair(x,0));
int cnt;
if(it==s[i].end() || (it->first)!=x) cnt=0;
else cnt=it->second,s[i].erase(it);
s[i].insert(make_pair(x,cnt+1));
}
for(set<pii>::iterator it=s[i].begin();it!=s[i].end();it++){
for(int j=1;j<=k;j++) val[j][i]=(1ll*val[j][i]*mul[j]%mod[j]+1ll*(it->first)*(it->second)%mod[j])%mod[j];
}
}
int ans=0;
for(int t=1;t<=q;t++){
int op,l,r; read(op,l,r);
if(op==1) merge(l,r);
else{
bool flag=1;
for(int i=1;i<=k;i++) flag&=(val[i][l]==val[i][r]);
if(flag) ans^=t;
}
}
wrt(ans);
return flush(),0;
}