用的是离线询问,带删线性基的做法。仅 AC #1。
#include <bitset>
#include <cstdio>
#include <iostream>
using namespace std;
const int N=1010;
typedef bitset<N> BT;
inline void in(BT &x) {
string s;
cin>>s;
BT tmp(s);
x=tmp;
}
inline void out(BT x) {
bool flag=0;
for(int i=999;i>=0;--i) {
if(x[i]||flag) putchar('0'+x[i]);
if(x[i]) flag=1;
}
if(!flag) putchar('0');
putchar('\n');
}
int tot,hd[N];
struct node {
int next,to;
BT v;
} edg[N];
inline void add(int fr,int to,BT v) {
edg[++tot].to=to;
edg[tot].v=v;
edg[tot].next=hd[fr];
hd[fr]=tot;
}
BT p[N];
int t[N];
void upd(BT x,int time) {
for(int i=1000;i>=0;--i)
if(x[i]) {
if(t[i]<time) swap(time,t[i]),swap(x,p[i]);
if(time==0) break;
x^=p[i];
}
}
void getmx(int time) {
BT ans;
for(int i=1000;i>=0;--i)
if(time<t[i]&&!ans[i]) ans^=p[i];
out(ans);
}
BT dis[N];
bool vis[N];
void DFS(int x) {
vis[x]=1;
for(int i=hd[x];i;i=edg[i].next) {
int v=edg[i].to;
if(vis[v]) upd(dis[v]^edg[i].v^dis[x],0x3f3f3f3f);
else dis[v]=dis[x]^edg[i].v,DFS(v);
}
}
int n,m,q,qcnt,ed[N],op[N],del[N];
BT val[N];
pair<int,int>New[N];
int main () {
ios::sync_with_stdio(0);
cin>>n>>m>>q;
int num=q+1;
for(int i=1;i<=m;++i) {
int u,v;
BT w;
cin>>u>>v,in(w);
add(u,v,w);
}
DFS(1);
for(int i=1;i<=q;++i) {
string s;
cin>>s;
int x,y;
BT z;
if(s=="Add") {
cin>>x>>y,in(z);
op[i]=++qcnt;
val[qcnt]=(z^dis[x]^dis[y]);
New[qcnt]=make_pair(x,y);
del[qcnt]=qcnt;
}
else if(s=="Change") {
cin>>x,in(z);
ed[del[x]]=i;
op[i]=--num;
val[num]=(z^dis[New[x].first]^dis[New[x].second]);
del[x]=num;
}
else if(s=="Cancel") {
cin>>x;
ed[del[x]]=i;
}
}
for(int i=1;i<=q;++i)
if(!ed[i]) ed[i]=0x3f3f3f3f;
getmx(0);
for(int i=1;i<=q;++i) {
if(op[i]) upd(val[op[i]],ed[op[i]]);
getmx(i);
}
return 0;
}