算法与数据结构实验题 7.23 量子统计

实验任务

JustinRochester 有一个 \(n\) 位的量子计算机。在进行计算后,会返回一个长度为 \(n\)\(01\) 串。

但由于相干性问题,计算后的结果可能会产生小概率的偏差。

为了避免结果的偏差,JustinRochester 重复计算了 \(k\) 次,并统计了每次的输出结果。

现在,JustinRochester 有 \(q\) 次询问,每次询问,他会问你某个 \(01\) 串出现的次数。

数据输入

第一行三个整数,分别为 \(n,k,q,(1<n<40,1<k,q<10^5)\),分别表示量子计算机的位数、重复计算次数和询问次数。

保证 \(n\)\(4\) 的倍数。

接下来 \(k\) 行,每行一个长度为 \(\frac{n}{4}\) 的字符串,表示该次计算结果的十六进制表示。

接下来 \(q\) 行,每行一个长度为 \(\frac{n}{4}\) 的字符串,表示该次询问的串的十六进制表示。

本处的十六进制串保证只由 \(0-9\)\(A-F\) 构成。

数据输出

\(q\) 行。对于每个询问,输出该串在上述计算结果中的出现次数。

输入示例

4 5 5
0
3
2
4
1
8
1
D
0
D
0
D
4
8
0

输出示例

0
2
1
1
0

一般代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;

ll n,k,q;
string x;
unordered_map<string,int>mp;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	cin>>n>>k>>q;
	for(long long i=1;i<=k;i++) {
		cin>>x;
		mp[x]++;
	}
	for(long long i=1;i<=q;i++) {
		cin>>x;
		cout<<mp[x]<<'\n';
	}
}

卡内存代码(如果上面的代码MLE的话用这个试试)

#include<bits/stdc++.h>
using namespace std;
typedef unsigned short us;
typedef long long ll;
typedef unsigned long long ull;
const int inf=2e9+1;

int n,k,q;
unordered_map<ll,us>cnt;	//unsigned short刚好卡住k,q的范围
string s;

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>k>>q;
	for(int i=1;i<=k;i++) {
		cin>>s;
		ll num=stoll(s, 0, 16);	//将十六进制字符串转换为数字
		cnt[num]++;
	}
	for(int i=1;i<=q;i++) {
		cin>>s;
		ll num=stoll(s, 0, 16);
		cout<<cnt[num]<<'\n';
	}
	return 0;
}

思路

posted @ 2024-12-11 20:26  Severj  阅读(79)  评论(0)    收藏  举报