您的位置:首页 > 其它

HDU 5637 Transform 搜索

2016-03-06 10:36 295 查看
题意:bc round 74 div1 1002 中文题

分析(官方题解):注意到答案实际上只和s⊕t有关, bfs预处理下从0到xx的最短步数, 然后查询O(1)回答即可.

#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
#include <cmath>
using namespace std;
typedef long long LL;
const int mod=1e9+7;
const int N=2e5+5;
vector<int>a;
queue<int>q;
int p
;
int main()
{
int T,n,m;
scanf("%d", &T);
while(T--)
{
scanf("%d%d",&n,&m);
a.clear();
for(int i=0;i<n;++i)
{
int tmp;
scanf("%d",&tmp);
a.push_back(tmp);
}
int l=log2(N);
l++;
for(int i=0;i<=l;++i)
a.push_back((1<<i));
memset(p,-1,sizeof(p));
q.push(0);
p[0]=0;
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=0;i<a.size();++i)
{
int y=(x^a[i]);
if(y>N-5||p[y]!=-1)continue;
p[y]=p[x]+1;
q.push(y);
}
}
LL ans=0;
for(int i=1;i<=m;++i)
{
int s,t;
scanf("%d%d",&s,&t);
LL x=i,y=p[s^t];
ans=(ans+x*y%mod)%mod;
}
printf("%I64d\n",ans);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: