这是一个阅读程序题
先放程序,你并不需要知道这个程序到底在做什么
#include<cstdlib>
#include<ctime>
#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
int n,m,k,ans;
unsigned long long a[1000005],b;
unsigned long long d2(unsigned long long x,unsigned long long y)
{
unsigned long long ans=0;
for(unsigned long long i=0;i<=64;i++)
if(((unsigned long long)(1ull<<i)&x)!=((unsigned long long)(1ull<<i)&y))
ans++;
return ans;
}
namespace GET64{
int sd;
inline unsigned long long r()
{
return (unsigned long long)((rand()<<1)|(rand()&1));
}
inline unsigned long long rng64()
{
return (r()<<48)|(r()<<32)|(r()<<16)|r();
}
inline void get64(int &n,unsigned long long *a)
{
scanf("%d%d",&n,&sd),srand((unsigned int)sd);
for(int i=1;i<=n;i++) a[i]=rng64();
}
}using GET64::get64;
int main()
{
get64(n,a);
scanf("%d%d",&m,&k);
if(!k)
{
map<unsigned long long,unsigned long long>mp;
for(int i=1;i<=n;i++)
mp[a[i]]++;
while(m--)
{
scanf("%llu",&b);
printf("%llu\n",mp[b]);
}
return 0;
}
while(m--)
{
ans=0;
scanf("%llu",&b);
for(unsigned long long i=1;i<=n;i++)
if(d2(a[i],b)<=k)ans++;
cout<<ans;
}
return 0;
}
这是即将要提交到OJ上的版本,我们将其设为版本1
#include<cstdlib>
#include<ctime>
#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
int n,m,k,ans;
unsigned long long a[1000005],b;
unsigned long long d2(unsigned long long x,unsigned long long y)
{
unsigned long long ans=0;
for(unsigned long long i=0;i<=64;i++)
if(((unsigned long long)(1ull<<i)&x)!=((unsigned long long)(1ull<<i)&y))
ans++;
return ans;
}
namespace GET64{
int sd;
inline unsigned long long r()
{
return (unsigned long long)((rand()<<1)|(rand()&1));
}
inline unsigned long long rng64()
{
return (r()<<48)|(r()<<32)|(r()<<16)|r();
}
inline void get64(int &n,unsigned long long *a)
{
scanf("%d%d",&n,&sd),srand((unsigned int)sd);
for(int i=1;i<=n;i++) a[i]=rng64();
}
}using GET64::get64;
int main()
{
get64(n,a);
scanf("%d%d",&m,&k);
if(!k)
{
map<unsigned long long,unsigned long long>mp;
for(int i=1;i<=n;i++)
mp[a[i]]++;
while(m--)
{
scanf("%I64u",&b);
printf("%I64u\n",mp[b]);
}
return 0;
}
while(m--)
{
ans=0;
scanf("%I64u",&b);
for(unsigned long long i=1;i<=n;i++)
if(d2(a[i],b)<=k)ans++;
cout<<ans;
}
return 0;
}
而这个版本是用来在自己电脑上进行测试的,我们将其设定为版本2
那么问题来了,我用版本2在自己电脑上自测时并没有什么问题,但是当我用版本1在某OJ上测试时程序就会只输出0。
谢谢你们Orz!