记录编号 401842 评测结果 AAAAAAAAAA
题目名称 [HAOI 2017]八纵八横 最终得分 100
用户昵称 Gravatarchad 是否通过 通过
代码语言 C++ 运行时间 0.934 s
提交时间 2017-05-04 09:38:30 内存使用 43.61 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<iomanip>
#include<bitset>
using namespace std;
#define ll            long long
#define ull           unsigned long long 
#define up(i,j,n)     for(int i=j;i<=n;i++)
#define FILE     	    "eights"
#define db       	     long double
#define pii           pair<int,int>
#define eps           1e-10
#define N             1001
int read(){
    int x=0,f=1,ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
    return f*x;
}
const int maxn=(int)1e5+10,inf=(int)1e9,mod=59991,limit=18;
template<class T> inline bool cmax(T& a,T b){return a<b?a=b,true:false;}
template<class T> inline bool cmin(T& a,T b){return a>b?a=b,true:false;}
template<class T> inline T max(T& a,T& b){return a>b?a:b;}
template<class T> inline T min(T& a,T& b){return a<b?a:b;}
template<class T> inline T squ(T a){return a*a;}
int n,m,Q;
typedef bitset<1024> Int;
Int mat[1024],w[1024],ji[1024];
char s[maxn];
Int readInt(){
	scanf("%s",s);int n=strlen(s);
	reverse(s,s+n);Int tmp;tmp.reset();
	for(int i=0;i<n;i++)tmp[i]=s[i]-'0';
	return tmp;
}
void Insert(Int x,Int* ji){
	for(int i=N;i>=0;i--){
		if(x[i]){
			if(ji[i][i])x^=ji[i];
			else {
				ji[i]=x;
				for(int j=i-1;j>=0;j--)
					if(ji[j][j]&&ji[i][j])ji[i]^=ji[j];
				for(int j=i+1;j<=N;j++)
					if(ji[j][i])ji[j]^=ji[i];
				return;
			}
		}
	}
}
bool cmp(Int a,Int b){
	for(int i=N;i>=0;i--)if(a[i]!=b[i])return a[i]>b[i];
	return 0;
}
Int get(Int ji[]){
	Int tmp;tmp.reset();
	for(int i=N;i>=0;i--)
		tmp^=ji[i];
	return tmp;
}
char ts[maxn];
void print(Int a){
	bool f=0;int top=0;
	for(int i=N;i>=0;i--){
		if(a[i])f=1;
		if(f)ts[top++]=a[i]+'0';
	}
	if(!f)ts[top++]='0';
	ts[top++]='\0';
	puts(ts);
}
struct node{
	int y,next,id;Int v;
}e[maxn<<1];int len,linkk[maxn];
void insert(int x,int y,Int v,int id){
	e[++len].y=y;
	e[len].next=linkk[x];
	linkk[x]=len;
	e[len].v=v;
	e[len].id=id;
}
int vis[maxn];
void dfs(int x){
	vis[x]=1;
	for(int i=linkk[x];i;i=e[i].next){
		int y=e[i].y;
		if(vis[y]){
			Insert(e[i].v^w[x]^w[y],ji);
		}
		else {
			w[y]=w[x]^e[i].v;
			dfs(y);
		}
	}
}
pii t[maxn];int num=0,id[maxn];
Int val[maxn];
vector<Int> k[maxn];
void build(int o,int l,int r,int L,int R,Int w){
	if(l>R||r<L)return;
	if(l>=L&&r<=R){
		k[o].push_back(w);
		return;
	}
	int mid=(l+r)>>1;
	build(o<<1,l,mid,L,R,w);
	build(o<<1|1,mid+1,r,L,R,w);
}
void query(int o,int l,int r,Int* ji){
	if(l>r)return;
	for(int i=0;i<k[o].size();i++)
		Insert(k[o][i],ji);
	Int w[1024];memcpy(w,ji,sizeof(w));
	if(l==r){
		print(get(ji));
		return;
	}
	int mid=(l+r)>>1;
	query(o<<1,l,mid,ji);
	query(o<<1|1,mid+1,r,w);
}
int xx[maxn],yy[maxn];
int main(){
	freopen(FILE".in","r",stdin);
	freopen(FILE".out","w",stdout);
	n=read(),m=read(),Q=read();
	up(i,1,m){
		int x=read(),y=read();Int v=readInt();
		insert(x,y,v,i);insert(y,x,v,i);
	}
	dfs(1);
	print(get(ji));
	up(i,1,Q){
		scanf("%s",s);
		if(s[1]=='d'){
			int x=read(),y=read();
			Int Val=readInt();Val^=w[x]^w[y];
			t[++num].first=i;id[num]=i;val[num]=Val;
			xx[num]=x,yy[num]=y;
		}
		if(s[1]=='h'){
			int x=read();Int Val=readInt();Val^=w[xx[x]]^w[yy[x]];
			build(1,1,Q,t[x].first,i-1,val[x]);
			val[x]=Val;t[x].first=i;
		}
		if(s[1]=='a'){
			int x=read();
			build(1,1,Q,t[x].first,i-1,val[x]);
			t[x].second=1;
		}
	}
	for(int i=1;i<=num;i++)if(!t[i].second)build(1,1,Q,t[i].first,Q,val[i]);
	query(1,1,Q,ji);
	return 0;
}