梦 回 初 赛
  • 板块学术版
  • 楼主蒟蒻炒扇贝
  • 当前回复15
  • 已保存回复15
  • 发布时间2020/11/2 09:01
  • 上次更新2023/11/5 09:14:30
查看原帖
梦 回 初 赛
19228
蒟蒻炒扇贝楼主2020/11/2 09:01

这是一个阅读程序题

先放程序,你并不需要知道这个程序到底在做什么

#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!

2020/11/2 09:01
加载中...