问题 B: 分组统计
时间限制: 1 Sec 内存限制: 32 MB
提交: 2134 解决: 522
[提交][状态][讨论版][命题人:外部导入]
题目描述
先输入一组数,然后输入其分组,按照分组统计出现次数并输出,参见样例。
输入
输入第一行表示样例数m,对于每个样例,第一行为数的个数n,接下来两行分别有n个数,第一行有n个数,第二行的n个数分别对应上一行每个数的分组,n不超过100。
输出
输出m行,格式参见样例,按从小到大排。
样例输入
1
7
3 2 3 8 8 2 3
1 2 3 2 1 3 1
样例输出
1={2=0,3=2,8=1}
2={2=1,3=0,8=1}
3={2=1,3=1,8=0}
分析:题目描述不是很正确。使用哈希的思想,直接使用map映射。有两个需要注意的地方,一是hash数组的大小设置,因为题目中整数没有给范围,所以要设置大一些;再一个就是我自己的问题,map用过一次后记得清除。
map<int,int[100010]> mp; //这里的数组相对于hash数组,所以下标对应的是整数的大小
int main(){
int m;
cin>>m;
while(m--){
int n;
cin>>n;
int s1[110];
for(int i=0;i<n;i++)
cin>>s1[i];
int s[110];
for(int i=0;i<n;i++){
cin>>s[i];
mp[s[i]][s1[i]]++;
}
sort(s,s+n);
int l1=unique(s,s+n)-s; //得到分组去重从小到大排序
sort(s1,s1+n);
int l2=unique(s1,s1+n)-s1;//得到输入数的去重排序
for(int i=0;i<l1;i++){
cout<<s[i]<<"={";
for(int j=0;j<l2;j++){
cout<<s1[j]<<"="<<mp[s[i]][s1[j]];
if(j!=l2-1)
cout<<",";
}
cout<<"}"<<endl;
}
mp.clear(); //注意清除
}
return 0;
}