题目链接:HDU - 5637
因为每次都是异或操作,所以从S->T,等价于异或的:0->S^T。所以我们从0开始跑BFS即可。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=20,mod=1e9+7;
int n,a[N],m,d[1<<18],res;
void solve(){
cin>>n>>m; memset(d,-1,sizeof d); d[0]=0; res=0;
for(int i=1;i<=n;i++) cin>>a[i];
queue<int> q; q.push(0);
while(q.size()){
int u=q.front(); q.pop();
for(int i=1;i<=n;i++) if(d[u^a[i]]==-1) d[u^a[i]]=d[u]+1,q.push(u^a[i]);
for(int i=0;i<17;i++) if(d[u^(1<<i)]==-1) d[u^(1<<i)]=d[u]+1,q.push(u^(1<<i));
}
for(int i=1,a,b;i<=m;i++) scanf("%d %d",&a,&b),res=(res+1LL*i*d[a^b]%mod)%mod;
printf("%d\n",res);
}
signed main(){
int T; cin>>T; while(T--) solve();
return 0;
}