AcWing5719. 词频统计

https://www.acwing.com/problem/content/description/5722/

题目描述

在学习了文本处理后,小 P 对英语书中的 n 篇文章进行了初步整理。

具体来说,小 P将所有的英文单词都转化为了整数编号。

假设这 n 篇文章中共出现了 m个不同的单词,则把它们从 11 到 m 进行编号。

这样,每篇文章就简化为了一个整数序列,其中每个数都在 11 到 m 范围内。

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

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

输入共 n+1 行。

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

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

输出格式

输出共 m 行。

第 i 行输出由空格分隔的两个整数 xi 和 yi,表示共有 xi 篇文章包含单词 i,总计出现次数为 yi。

数据范围

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

输入样例
4 3
5 1 2 3 2 1
1 1
3 2 2 2
2 3 2
输出样例
2 3
3 6
2 2

样例解释

4 3 // 4篇文章,单词编号范围1~3

5 1 2 3 2 1 // 第1篇:长度5,单词序列为[1,2,3,2,1]

1 1 // 第2篇:长度1,单词序列为[1]

3 2 2 2 // 第3篇:长度3,单词序列为[2,2,2]

2 3 2 // 第4篇:长度2,单词序列为[3,2]

2 3 // 单词1:出现在2篇文章中,总次数3

3 6 // 单词2:出现在3篇文章中,总次数6

2 2 // 单词3:出现在2篇文章中,总次数2

核心思路解析
1.对于每篇文章,使用st数组记录该文章中出现过的单词,确保每个单词在同一篇文章中只被计数一次(用于统计cnt)
2.同时使用tot数组累加每个单词在所有文章中的出现总次数
3.处理完所有文章后,按单词编号 1 到 m 的顺序输出结果

#include <bits/stdc++.h>
using namespace std;

const int N=110;
int cnt[N],tot[N];
bool st[N];
int n,m;

int main(){
    cin>>n>>m;
    while(n--){
        int k;
        cin>>k;
        memset(st,0,sizeof st);// 重置标记数组,每次处理新文章时都要初始化
        
        while(k--){
            int x;
            cin>>x;
            tot[x]++;

           // 如果当前文章中第一次出现单词x
            if(!st[x]){
                st[x]=true;
                cnt[x]++;// 累加单词x出现的文章数
            }
        }
    }
    for(int i=1; i<=m; i++){
        cout<<cnt[i]<<" "<<tot[i]<<endl;
    }
    
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值