关于异或哈希的正确性(已过官方)
查看原帖
关于异或哈希的正确性(已过官方)
334727
BreakPlus楼主2023/1/18 17:31

RT,为何本题异或 hash 写了 9 重也过不了?

/*------------------------------*/
/* Author: BreakPlus            */
/* Email: breakplus@foxmail.com */
/*------------------------------*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> P;
typedef pair<pair<ll,ll>,ll> P3;
typedef pair<pair<ll,ll>,pair<ll,ll> >P4;
#define mkp make_pair
#define fi first
#define se second
//#define FastIO
//#define OIcontest
const ll mod=998244353;
const ll maxn=500005;

inline ll read(){
    ll x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x*f;
}
inline ll maxx(ll a,ll b){ return a>b?a:b; }
inline ll minn(ll a,ll b){ return a<b?a:b; }
inline ll lowbit(ll x){ return x&-x; }
inline ll qpow(ll a,ll b){
    ll ans=1, base=a;
    while(b){
        if(b&1) ans=ans*base%mod;
        base=base*base%mod;
        b>>=1;
    }
    return ans;
}
struct Comb{
    ll fac[maxn], inv[maxn];
    Comb(){
       fac[0]=1;
       for(ll i=1;i<=maxn-5;i++) fac[i]=fac[i-1]*i%mod;
       inv[maxn-5]=qpow(fac[maxn-5],mod-2);
       for(ll i=maxn-6;i>=0;i--) inv[i]=inv[i+1]*(i+1)%mod;
    }
    ll C(ll a,ll b){
        if(a<0 || b<0) return 0;
        if(a<b) return 0;
        return fac[a]*inv[b]%mod*inv[a-b]%mod;
    }
}comb;
/*--------------head------------------*/

void init(){

}
ll n,m;

ll num1[maxn],num2[maxn],num3[maxn],num4[maxn],num5[maxn],num6[maxn],num7[maxn],num8[maxn],num9[maxn];
ll rl1[maxn],rl2[maxn],rl3[maxn],rl4[maxn],rl5[maxn],rl6[maxn],rl7[maxn],rl8[maxn],rl9[maxn];
ll w1[maxn],w2[maxn],w3[maxn],w4[maxn],w5[maxn],w6[maxn],w7[maxn],w8[maxn],w9[maxn];
ll tw1,tw2,tw3,tw4,tw5,tw6,tw7,tw8,tw9;
mt19937 rnd(233);
void solve(){
//	srand(time(0));
	n=read(), m=read();
//	tw = time(0);
	for(ll i=1;i<n;i++){
		w1[i] = (rnd()+1), tw1 ^= w1[i];
		w2[i] = (rnd()+2), tw2 ^= w2[i];
		w3[i] = (rnd()+3), tw3 ^= w3[i];
		w4[i] = (rnd()+4), tw4 ^= w4[i];
		w5[i] = (rnd()+5), tw5 ^= w5[i];
		w6[i] = (rnd()+6), tw6 ^= w6[i];
		w7[i] = (rnd()+7), tw7 ^= w7[i];
		w8[i] = (rnd()+8), tw8 ^= w8[i];
		w9[i] = (rnd()+9), tw9 ^= w9[i];
	}
	w1[n] = tw1;
	w2[n] = tw2;
	w3[n] = tw3;
	w4[n] = tw4;
	w5[n] = tw5;
	w6[n] = tw6;
	w7[n] = tw7;
	w8[n] = tw8;
	w9[n] = tw9;
	
	
	ll q , ans1 = 0, ans2 = 0, ans3 = 0, ans4 = 0, ans5 = 0, ans6 = 0, ans7 = 0, ans8 = 0, ans9 = 0;
	
	for(ll i=1;i<=m;i++){
		ll u=read(), v=read();
		num1[v] ^= w1[u], ans1 ^= w1[u];
		num2[v] ^= w2[u], ans2 ^= w2[u];
		num3[v] ^= w3[u], ans3 ^= w3[u];
		num4[v] ^= w4[u], ans4 ^= w4[u];
		num5[v] ^= w5[u], ans5 ^= w5[u];
		num6[v] ^= w6[u], ans6 ^= w6[u];
		num7[v] ^= w7[u], ans7 ^= w7[u];
		num8[v] ^= w8[u], ans8 ^= w8[u];
		num9[v] ^= w9[u], ans9 ^= w9[u];
		rl1[v] = num1[v];
		rl2[v] = num2[v];
		rl3[v] = num3[v];
		rl4[v] = num4[v];
		rl5[v] = num5[v];
		rl6[v] = num6[v];
		rl7[v] = num7[v];
		rl8[v] = num8[v];
		rl9[v] = num9[v];
	} 
	
	q=read();
	while(q--){
		ll t=read(),u,v;
		
		if(t==1 || t==3){
			u=read(), v=read();
			rl1[v] ^= w1[u];
			rl2[v] ^= w2[u];
			rl3[v] ^= w3[u];
			rl4[v] ^= w4[u];
			rl5[v] ^= w5[u];
			rl6[v] ^= w6[u];
			rl7[v] ^= w7[u];
			rl8[v] ^= w8[u];
			rl9[v] ^= w9[u];
			ans1 ^= w1[u];
			ans2 ^= w2[u];
			ans3 ^= w3[u];
			ans4 ^= w4[u];
			ans5 ^= w5[u];
			ans6 ^= w6[u];
			ans7 ^= w7[u];
			ans8 ^= w8[u];
			ans9 ^= w9[u];
		}
		else if(t==2){
			u=read();
			ans1 ^= rl1[u], ans2 ^= rl2[u], ans3 ^= rl3[u];
			ans4 ^= rl4[u], ans5 ^= rl5[u], ans6 ^= rl6[u];
			ans7 ^= rl7[u], ans8 ^= rl8[u], ans9 ^= rl9[u];
			rl1[u] = rl2[u] = rl3[u] = 0;
			rl4[u] = rl5[u] = rl6[u] = 0;
			rl7[u] = rl8[u] = rl9[u] = 0;
		}
		else if(t==4){
			u=read();
			ans1 ^= rl1[u], ans2 ^= rl2[u], ans3 ^= rl3[u];
			ans4 ^= rl4[u], ans5 ^= rl5[u], ans6 ^= rl6[u];
			ans7 ^= rl7[u], ans8 ^= rl8[u], ans9 ^= rl9[u];
			rl1[u] = num1[u], rl2[u] = num2[u], rl3[u] = num3[u];
			rl4[u] = num4[u], rl5[u] = num5[u], rl6[u] = num6[u];
			rl7[u] = num7[u], rl8[u] = num8[u], rl9[u] = num9[u];
			ans1 ^= num1[u], ans2 ^= num2[u], ans3 ^= num3[u];
			ans4 ^= num4[u], ans5 ^= num5[u], ans6 ^= num6[u];
			ans7 ^= num7[u], ans8 ^= num8[u], ans9 ^= num9[u];
		}
		if(!ans1 && !ans2 && !ans3 && !ans4 && !ans5 && !ans6 && !ans7 && !ans8 && !ans9)
			puts("YES");
		else puts("NO");
	} 
}
int main(){
    #ifdef OIcontest
        freopen(".in","r",stdin);
        freopen(".out","w",stdout);
    #endif
    #ifdef FastIO
        ios::sync_with_stdio(0); cin.tie(0), cout.tie(0);
    #endif
    init();
    ll T=1;
    while(T--) solve();
    return 0;
}

2023/1/18 17:31
加载中...