题目链接:hdoj 5637 Transform
题意:给你
n
个数
1
, 将
2
,
问
s变为t
的最少次数。
思路:修改一位二进制位,相当于
⊕(1<<i)
,那么
a[]
最多有
32
个,
BFS
预处理一下就可以了。
AC 代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#define CLR(a, b) memset(a, (b), sizeof(a))
using namespace std;
typedef long long LL;
const int MAXN = 1e6+10;
const int INF = 0x3f3f3f3f;
const double eps = 1e-4;
const int MOD = 1e9+7;
int step[1<<17];
int a[16];
int main()
{
int t; scanf("%d", &t);
while(t--)
{
int n, m; scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++) scanf("%d", &a[i]);
queue<int> Q; Q.push(0); CLR(step, -1); step[0] = 0;
while(!Q.empty())
{
int u = Q.front(); Q.pop(); int v;
for(int i = 0; i < 17; i++)
{
v = u ^ (1<<i);
if(step[v] == -1)
{
Q.push(v);
step[v] = step[u] + 1;
}
}
for(int i = 0; i < n; i++)
{
v = u ^ a[i];
if(step[v] == -1)
{
step[v] = step[u] + 1;
Q.push(v);
}
}
}
LL ans = 0;
for(int i = 1; i <= m; i++)
{
int s, t;
scanf("%d%d", &s, &t);
LL res = step[s^t];
//cout << res << endl;
ans = (ans + 1LL * i * res % MOD) % MOD;
}
cout << ans << endl;
}
return 0;
}