算法与数据结构实验题 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;
}
思路