题目描述
先输入一组数,然后输入其分组,按照分组统计出现次数并输出,参见样例。
输入
输入第一行表示样例数m,对于每个样例,第一行为数的个数n,接下来两行分别有n个数,第一行有n个数,第二行的n个数分别对应上一行每个数的分组,n不超过100。
输出
输出m行,格式参见样例,按从小到大排。
样例输入 Copy
1
7
3 2 3 8 8 2 3
1 2 3 2 1 3 1
样例输出 Copy
1={2=0,3=2,8=1}
2={2=1,3=0,8=1}
3={2=1,3=1,8=0}
代码
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int m; //m为样例数
scanf("%d",&m);
while(m--)
{
int n; //n为每行数的个数
scanf("%d",&n);
int hashTable1[100010]={
0};
int num[110],k1=0; //num[]存放的为去重后,从小到大排序的数
int a[110];
int maxn = 0; //a[]存放的为第一行数
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
if(hashTable1[a[i]]==0){
hashTable1[a[i]]++;
num[k1++] = a[i];
}
if(maxn<a[i]) //此处不记录易出现溢出
maxn = a[i];
}
sort(num,num+k1);
int hashTable2[110]={
0};
int c[110]; //c[]存放的为第二行数
int cg[110],k2=0; //cg存放的为去重后,从小到大排序的分组名。
int ans[n+10][maxn+10]={
0}; //ans[i][j] i为分组,j为数 a[i][j]为第i组的j数出现的次数
for(int i=0; i<n; i++)
{
scanf("%d",&c[i]);
ans[c[i]][a[i]]++;
if(hashTable2[c[i]]==0)
{
hashTable2[c[i]]++;
cg[k2++] = c[i];
}
}
sort(cg,cg+k2);
//输出
for(int i=0; i<k2; i++)
{
printf("%d={",cg[i]);
for(int j=0; j<k1; j++)
{
printf("%d=%d",num[j], ans[cg[i]][num[j]]);
if(j<k1-1) printf(",");
else printf("}\n");
}
}
}
return 0;
}