【csp202403-1】词频统计【第33次CCF计算机软件能力认证】

问题描述

在学习了文本处理后,小P对英语书中的𝑛篇文章进行了初步整理。具体来说,小P将所有的英文单词都转化为了整数编号。假设这𝑛篇文章中共出现了𝑚个不同的单词,则把它们从1到𝑚进行编号。这样,每篇文章就简化为了一个整数序列,其中每个数都在1到𝑚范围内。

现给出小P处理后的𝑛篇文章,对于每个单词𝑖(1≤𝑖≤𝑚),试统计:

  1. 单词𝑖出现在了多少篇文章中?
  2. 单词𝑖在全部文章中总共出现了几次?

输入格式

从标准输入读入数据。

输入共𝑛+1行。

输入的第一行包含两个正整数𝑛和𝑚,分别表示文章篇数和单词编号上限。

输入的第𝑖+1行(1≤𝑖≤𝑛)包含由空格分隔的若干整数,其中第一个整数𝑙𝑖​表示第𝑖篇文章的长度(单词个数);接下来𝑙𝑖个整数表示对应的整数序列,序列中每个整数均在1到𝑚范围内,各对应原文中的一个单词。

输出格式

输出到标准输出。

输出共𝑚行。

第𝑖i行(1≤𝑖≤𝑚)输出由空格分隔的两个整数𝑥𝑖和𝑦𝑖​,表示共有𝑥𝑖篇文章包含单词𝑖,总计出现次数为𝑦𝑖​。

样例输入

4 3
5 1 2 3 2 1
1 1
3 2 2 2
2 3 2

样例输出

2 3
3 6
2 2

样例解释

单词2在:

  • 文章1中出现两次;
  • 文章3中出现三次;
  • 文章4中出现一次。

因此𝑥2=3、𝑦2=6。

数据范围

全部的测试数据满足0<𝑛,𝑚≤100,且每篇文章至少包含一个单词、最多不超过100个单词(1≤𝑙𝑖≤100)。

题解

由于单词已经简化成数字,开两个普通数组分别统计两个问题即可。

对于第2个问题,单词在全部文章中出现的次数,开一个数组计数器,单词每出现一次,计数器加一

对于第1个问题,由于数据范围较小,可以开一个二维数组,vis[i][j]表示在第i篇文章中单词j是否出现过,最后遍历一遍统计每一篇文章中出现过的单词数

#include <cstdio>
int n,m,l[105],cnt[105];
bool vis[105][105];
int main()
{
	int i,j,x;
	scanf("%d%d",&n,&m);
	for (i=1;i<=n;i++)
	{
		scanf("%d",&l[i]);
		for (j=1;j<=l[i];j++)
		{
			scanf("%d",&x);
			cnt[x]++;
			vis[i][x]=1;
		}
	}
	int s;
	for (i=1;i<=m;i++)
	{
		s=0;
		for (j=1;j<=n;j++)
		  if (vis[j][i])
		    s++;
		printf("%d %d\n",s,cnt[i]); 
	}
	return 0;
}

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值