记录编号 |
401842 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HAOI 2017]八纵八横 |
最终得分 |
100 |
用户昵称 |
chad |
是否通过 |
通过 |
代码语言 |
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;
}