CCF CSP 第33次(2024.03)(1_词频统计_C++)

时间限制: 1.0 秒
空间限制: 512 MiB

题目描述:

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

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

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

输入格式:

从标准输入读入数据。

输入共 n+1 行。

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

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

输出格式:

输出到标准输出。

输出共 m 行。

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

样例输入:

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 中出现一次。

因此 x2= 3、y2 = 6。

子任务:

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

解题思路:

思路一:

1、解题步骤拆分:
① 输入数据:

  • 第一行 n m (n代表文章数,m代表符号上限)
  • 下面n行其中一行,第一个整数(l)代表单词书,后面l个整数代表不同的单词

② 数据处理:在输入的时候可进行数据的统计,统计每本书中单词出现的次数,并统计每个文章中出现的单词种类。
③ 结果输出:输出每个单词的文章出现次数和总出现次数

代码实现

代码实现(思路一):
#include <iostream>
#include <vector>
#include <unordered_set>

using namespace std;

int main(int argc, char const *argv[])
{
    int n, m;
    cin >> n >> m;  // 输入n(文章数量)和m(单词数量)

    // occurrences数组用于记录每个单词出现的总次数(共m个单词,编号从1到m)
    vector<int> occurrences(m + 1, 0);
    
    // article_count数组用于记录每个单词出现过的文章数
    vector<int> article_count(m + 1, 0);

    // unordered_set用于记录每篇文章中已经出现过的单词(保证每篇文章中的单词唯一)
    unordered_set<int> mp_set;

    // 处理n篇文章
    for (int i = 1; i <= n; i++) {
        int l;
        cin >> l;  // 输入当前文章中单词的数量
        int word;
        mp_set.clear();  // 清空mp_set,开始处理新的一篇文章
        
        // 处理当前文章中的每个单词
        for (int j = 1; j <= l; j++) {
            cin >> word;  // 输入当前单词
            occurrences[word]++;  // 增加该单词的出现次数
            mp_set.insert(word);  // 插入该单词到set中,自动去重,保证单篇文章中同一单词只计算一次
        }

        // 遍历当前文章中的所有单词,更新这些单词的文章出现次数
        for (auto &i : mp_set) {
            article_count[i]++;  // 增加该单词出现过的文章数
        }
    }

    // 输出每个单词的文章出现次数和总出现次数
    for (int i = 1; i <= m; i++) {
        cout << article_count[i] << " " << occurrences[i] << endl;
    }

    return 0;
}

欢迎大家和我沟通交流(✿◠‿◠)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值