时间限制: 1.0 秒
空间限制: 512 MiB
题目描述:
在学习了文本处理后,小 P 对英语书中的 n 篇文章进行了初步整理。 具体来说,小 P 将所有的英文单词都转化为了整数编号。假设这 n 篇文章中共出现了 m 个不同的单词,则把它们从 1 到 m 进行编号。 这样,每篇文章就简化为了一个整数序列,其中每个数都在 1 到 m 范围内。
现给出小 P 处理后的 n 篇文章,对于每个单词 i(1≤i≤m),试统计:
- 单词 i 出现在了多少篇文章中?
- 单词 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;
}
欢迎大家和我沟通交流(✿◠‿◠)