【hash】ABCDEF

ABCDEF (ABCDEF.c/cpp/pas)

【题目描述】

LazyChild有n个在[-30000,30000]区间内的整数,他想知道有多少个六元组(a,b,c,d,e,f)满足:

(a × b + c) ÷ d – e = f

【输入文件】

第一行一个整数n。

第二行n个整数。

【输出文件】

一行一个整数,表示有多少个满足要求的六元组。

【样例输入】

2

2 3

【样例输出】

4

【数据规模和约定】

对于30%的数据,1 <= n <= 10

对于100%的数据,1 <= n <= 100


朴素的六重循环。这种问题只要规模不是太大都可以通过hash来将数量级降低一半,否则用于hash计算,或者本处我采用的平衡二叉树所耗的时间将会很大。


但是因为我是个数学弱菜,移项的时候居然忘记考虑0,所以悲剧WA20。除法一定要考虑0呀,傻逼。


这里要注意,使用iterator手动操作map要比map的[]重载快得多得多。


但是还要注意,iterator一定要注意是否等于end()。否则一定会出错!


#include <cstdio>
#include <iostream>
#include <map>

using std::pair;
using std::make_pair;
using std::cout;
using std::map;

typedef long long ll;
ll ans = 0;
map<long,long> hash;
map<long,long>::iterator it1;
long num[110];

inline long getint()
{
	long rs=0;bool sgn=1;char tmp;
	do tmp = getchar();
	while (!isdigit(tmp)&&tmp-'-');
	if (tmp == '-'){tmp=getchar();sgn=0;}
	do rs=(rs<<3)+(rs<<1)+tmp-'0';
	while (isdigit(tmp=getchar()));
	return sgn?rs:-rs;	
}

int main()
{
	freopen("ABCDEF.in","r",stdin);
	freopen("ABCDEF.out","w",stdout);
	long n = getint();
	for (long i=1;i<n+1;i++)
		num[i] = getint();

	for (long i=1;i<n+1;i++)
		for (long j=1;j<n+1;j++)
			for (long k=1;k<n+1;k++)
			{
				long tmp = num[i]*num[j]+num[k];
				it1 = hash.find(tmp);
				if (it1 == hash.end())
					hash.insert(make_pair(tmp,1));
				else
					it1->second ++;
			}

	for (long k=1;k<n+1;k++)
		if (num[k] != 0)
		for (long i=1;i<n+1;i++)
			for (long j=1;j<n+1;j++)
			{
				long tmp = (num[i]+num[j])*num[k];
				//ans += hash[tmp];
				it1 = hash.find(tmp);
				if (it1 != hash.end())
					ans += it1->second;
			}
	cout << ans;
	return 0;
}


以下是使用Java SDK进行文件上传hash去重校验的详细代码示例,其中假设已经安装并启动了MinIO服务,并创建了一个名为“test-bucket”的存储桶。 ```java import io.minio.MinioClient; import io.minio.errors.*; import java.io.*; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MinioUploader { // 创建MinIO客户端对象 private static final MinioClient client = new MinioClient("http://localhost:9000", "ACCESS_KEY", "SECRET_KEY"); // 上传文件并进行hash去重校验 public static String uploadFile(String filePath, String bucketName, String objectName) throws IOException, NoSuchAlgorithmException, InvalidResponseException, InvalidKeyException, InvalidBucketNameException, NoSuchBucketException, ErrorResponseException, RegionConflictException { // 打开文件并计算MD5哈希值 File file = new File(filePath); FileInputStream fileInputStream = new FileInputStream(file); byte[] fileData = new byte[(int) file.length()]; fileInputStream.read(fileData); fileInputStream.close(); MessageDigest md5Digest = MessageDigest.getInstance("MD5"); byte[] md5Hash = md5Digest.digest(fileData); String objectNameHash = bytesToHex(md5Hash); // 判断文件是否已经存在于存储桶中 boolean objectExists = client.statObject(bucketName, objectNameHash) != null; // 文件已经存在,停止上传并返回文件URL if (objectExists) { String objectUrl = client.presignedGetObject(bucketName, objectNameHash); System.out.println("File already exists: " + objectUrl); return objectUrl; } // 文件不存在,进行上传操作 else { // 上传文件并指定对象名称 InputStream inputStream = new ByteArrayInputStream(fileData); client.putObject(bucketName, objectName, inputStream, file.length()); // 在对象上设置元数据,将MD5哈希值作为对象名称 client.setObjectMetadata(bucketName, objectName, "md5", objectNameHash); // 返回文件URL String objectUrl = client.presignedGetObject(bucketName, objectName); System.out.println("File uploaded successfully: " + objectUrl); return objectUrl; } } // 将字节数组转换为十进制字符串 private static String bytesToHex(byte[] bytes) { char[] hexArray = "0123456789ABCDEF".toCharArray(); char[] hexChars = new char[bytes.length * 2]; for (int i = 0; i < bytes.length; i++) { int v = bytes[i] & 0xFF; hexChars[i * 2] = hexArray[v >>> 4]; hexChars[i * 2 + 1] = hexArray[v & 0x0F]; } return new String(hexChars); } } ``` 在上述示例代码中,首先创建了一个MinIO客户端对象,并定义了一个名为“uploadFile”的函数来实现文件上传和hash去重校验的逻辑。具体而言,该函数接受三个参数:文件路径、存储桶名称和对象名称。在函数内部,首先使用Java标准库中的FileInputStream类打开文件并计算文件的MD5哈希值,然后通过调用MinIO客户端对象的“statObject”方法判断文件是否已经存在于存储桶中。如果文件已经存在,函数会返回该文件的URL并停止上传操作;否则,函数会调用MinIO客户端对象的“putObject”方法将文件上传到存储桶中,并使用“setObjectMetadata”方法在对象上设置元数据,将MD5哈希值作为对象名称。最后,函数会返回上传文件的URL。注意,在Java中需要手动将字节数组转换为十进制字符串,这里使用了一个辅助函数“bytesToHex”来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值