调了一个下午了\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;
}