BZOJ 4644

可以把修改当成删除再插入一个新的,

线性基不容易删除,就用线段树分治

好像手写的bitset在这里很慢

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a),i##_end=(b);i<=i##_end;++i)
#define For(i,a,b) for(int i=(a),i##_end=(b);i<i##_end;++i)
#define per(i,a,b) for(int i=(b),i##_st=(a);i>=i##_st;--i)
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define dbg(x) cerr<<#x" = "<<x<<endl
#define debug(...) fprintf(stderr, __VA_ARGS__)
#define Es(x,i) for(Edge*i=G[x];i;i=i->nxt)
typedef long long ll;
typedef pair<int,int> pii;
const int inf=~0u>>1,MOD=1e9+7;
inline int rd() {
    int x,c,f=1;while(!isdigit(c=getchar()))f=c!='-';x=c-'0';
    while(isdigit(c=getchar()))x=x*10+c-'0';return f?x:-x;
}

const int N=1011,MX=16;
typedef unsigned long long ui;
struct bs{
	#define Q 64
	ui w[MX];
	bs (int _t=1){if(!_t)memset(w,0,sizeof w);}
	bool operator<(const bs&t)const{
		per(i,0,MX-1)if(w[i]!=t.w[i])return w[i]<t.w[i];
	}
	void operator^=(const bs&b){
		For(i,0,MX)this->w[i]^=b.w[i];
	}
	bs operator^(const bs&b)const{
		static bs c;
		memset(c.w,0,sizeof c.w);
		For(i,0,MX)c.w[i]=w[i]^b.w[i];
		return c;
	}
	inline bool co(int i){
		return w[i>>6]>>(i&63)&1;
	}
	inline void print(){
		static int p[Q],i,j;
		ui x;
		for(i=MX-1;~i&&!w[i];--i);
		if(i==-1){
			putchar('0');
		}
		else{
			j=0,x=w[i];
			while(x)p[j++]=(x&1),x>>=1;
			per(k,0,j-1)putchar(p[k]+'0');
			for(--i;i>=0;--i){
				ui x=w[i];
				For(k,0,Q)p[k]=x&1,x>>=1;
				per(k,0,Q-1)putchar(p[k]+'0');
			}
		}
		putchar('\n');
	}
	#undef Q
};
int LL;
struct xxk{
	bs a[N];
	bool b[N];
	xxk(int _t=1){if(!_t)memset(a,0,sizeof a);}
	void add(bs x){
		per(i,0,LL)if(x.co(i)){
			if(!b[i]){
				b[i]=1,a[i]=x;
				break;
			}else x^=a[i];
		}
	}
	void qmx(){
		static bs tmp,p;
		memset(tmp.w,0,sizeof tmp.w);
		per(i,0,LL)if(b[i]){
			p=tmp^a[i];
			if(tmp<p)tmp=p;
		}
		tmp.print();
	}
} A[N<<2];
int ql,qr,qx;
bs ooo,p[N];
vector<bs> q[N<<2];
inline void tran(int o,int l,int r){
	if(ql<=l&&r<=qr){
		q[o].pb(p[qx]);
		return;
	}
	int m=l+r>>1;
	if(ql<=m)tran(o<<1,l,m);
	if(qr>m)tran(o<<1|1,m+1,r);
}
inline void solve(int o,int l,int r){
	A[o]=A[o>>1];
	for(vector<bs>::iterator it=q[o].begin();it!=q[o].end();++it){
		A[o].add(*it);
	}
	if(l==r){
		A[o].qmx();
		return;
	}
	int m=l+r>>1;
	solve(o<<1,l,m),solve(o<<1|1,m+1,r);
}
char s[N];
int n,m;
int b[N];
int main(){
#ifdef flukehn
	freopen("test.txt","r",stdin);
#endif
	ios::sync_with_stdio(0),cin.tie(0);
	cin>>n;
	cin>>n>>m;
	rep(i,1,n)b[i]=1;
	rep(i,1,m){
		int u,v;
		cin>>u>>v>>s;
		if(u==v)continue;
		memset(ooo.w,0,sizeof ooo.w);
		int j=strlen(s)-1,p=0;
		LL=max(LL,j);
		while(j>=63){
			ui &x=ooo.w[p];
			rep(k,j-64+1,j)x=(x<<1)+(s[k]-'0');
			j-=64,++p;
		}
		ui&x=ooo.w[p];
		rep(k,0,j)x=(x<<1)+(s[k]-'0');
		if(b[u]){
			ql=b[u],qr=i-1,qx=u;
			if(i!=1)tran(1,1,m);
			b[u]=i,::p[u]^=ooo;
		}
		if(b[v]){
			ql=b[v],qr=i-1,qx=v;
			if(i!=1)tran(1,1,m);
			b[v]=i,::p[v]^=ooo;
		}
	}
	rep(i,1,n){
		ql=b[i],qr=m,qx=i;
		tran(1,1,m);
	}
	solve(1,1,m);
}

 

转载于:https://www.cnblogs.com/limfc/p/8385513.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值