玄学WA求助
查看原帖
玄学WA求助
114153
Saliеri楼主2020/11/26 18:30

调了一个下午了\dk

#include <bitset>
#include <cstdio>
#include <vector> 
const int maxn = 5005;
typedef std :: bitset <1001> btst;
int n,m,q;
bool temp[1005];
btst bas[15][1001],tem;
void print(btst x) {
	int flag = 0;
	for(int i=999; ~i; --i) {
		if(x[i])flag = 1;
		if(flag)x[i]?putchar('1'):putchar('0');
	}
	puts("");
}
inline void insert(int dep,btst x) {
	for(int i=999; ~i; --i) {
		if(x[i]) {
			if(bas[dep][i] == 0){
				bas[dep][i] = x;
				return ;
			}
			else x ^= bas[dep][i];
		}
	}
}
int fa[maxn];
btst val[maxn];
int getfa(int x,btst &w) {
	if(fa[x] == x)return x;
	else {
		w^=val[x];
		return getfa(fa[x],w);
	}
}
int ncnt;
struct Edge {
	int from,to;
	btst val;
} e[maxn];
int pretim[maxn];
std :: vector <Edge> ed[maxn<<2];
void cover(int k,int l,int r,int x,int y,Edge v) {
	if(l>y||r<x||l>r)return ;
	if(l>=x&&r<=y)return ed[k].push_back(v);
	int mid = (l+r)>>1;
	cover(k<<1,l,mid,x,y,v),cover(k<<1|1,mid+1,r,x,y,v);
}
void getans(int k,int l,int r,int dep) {
	if(dep != 1)for(int i=0; i<=999; ++i)bas[dep][i] = bas[dep-1][i];
	for(int i=0; i<ed[k].size(); ++i) {
		int x = ed[k][i].from,y = ed[k][i].to;
		tem = ed[k][i].val;
		getfa(x,tem),getfa(y,tem);
		insert(dep,tem);
	}
	if(l == r) {
		tem = 0;
		for(int i=999; ~i; --i)
			if(tem[i] == 0 && bas[dep][i] != 0)
				tem ^= bas[dep][i];
		print(tem);
		return ;
	} else {
		int mid = (l+r)>>1;
		getans(k<<1,l,mid,dep+1),getans(k<<1|1,mid+1,r,dep+1);
	}
}
int main() {
//	freopen("bzbh.in","r",stdin);
//	freopen("bzbh.out","w",stdout);
	scanf("%d %d %d",&n,&m,&q);
	for(int i=1; i<=n; ++i)fa[i] = i;
	for(int i=1,x,y; i<=m; ++i) {
		scanf("%d %d ",&x,&y);
		tem = 0;
		int cnt = 0;
		char ch;
		while((ch=getchar()) != '\r' && ch != '\n')temp[++cnt] = ch-'0';
		for(int j=1; j<=cnt; ++j)
			tem[cnt-j] = temp[j];
		int X = getfa(x,tem),Y = getfa(y,tem);
		if(X == Y)insert(1,tem);
		else fa[X] = Y,val[X] = tem;
	}
	for(int i=1,x; i<=q; ++i) {
		char c[10];
		scanf("%s",c);
		if(c[0] == 'A') {
			++ncnt;
			scanf("%d %d ",&e[ncnt].from,&e[ncnt].to);
			int cnt = 0;
			tem = 0;
			char ch;
			while((ch=getchar()) != '\r' && ch != '\n')temp[++cnt] = ch-'0';
			for(int j=1; j<=cnt; ++j)
				tem[cnt-j] = temp[j];
			e[ncnt].val = tem;
			pretim[ncnt] = i;
		} 
		if(c[0] == 'C' && c[1] == 'a') {
			scanf("%d",&x);
			cover(1,0,q,pretim[x],i-1,e[x]);
			pretim[x] = q+1;
		}
		if(c[0] == 'C' && c[1] == 'h') {
			scanf("%d",&x);
			cover(1,0,q,pretim[x],i-1,e[x]);
			int cnt = 0;
			tem = 0;
			char ch;
			while((ch=getchar()) != '\r' && ch != '\n')temp[++cnt] = ch-'0';
			for(int j=cnt; j>=1; --j)
				tem[cnt-j] = temp[j];
			e[x].val = tem;
			pretim[x] = i;
		}
	}
	for(int i=1; i<=ncnt; ++i)cover(1,0,q,pretim[i],q,e[i]);
	getans(1,0,q,1);
	return 0;
} 
2020/11/26 18:30
加载中...