在學習了文本處理后,小?P?對英語書中的?n篇文章進行了初步整理。
具體來說,小?P將所有的英文單詞都轉化為了整數編號。
假設這 n?篇文章中共出現了?m個不同的單詞,則把它們從?1到?m進行編號。
這樣,每篇文章就簡化為了一個整數序列,其中每個數都在?1?到?m范圍內。
現給出小?P處理后的?n篇文章,對于每個單詞?ii(1≤i≤m),試統計:
- 單詞?i?出現在了多少篇文章中?
- 單詞?i在全部文章中總共出現了幾次?
輸入格式
輸入共?n+1行。
輸入的第一行包含兩個正整數?n?和?m,分別表示文章篇數和單詞編號上限。
輸入的第?i+1行包含由空格分隔的若干整數,其中第一個整數?li表示第?i篇文章的長度(單詞個數);接下來?li個整數表示對應的整數序列,序列中每個整數均在?1到?m?范圍內,各對應原文中的一個單詞。
輸出格式
輸出共?m行。
第?ii行輸出由空格分隔的兩個整數?xi和?yi,表示共有?xi篇文章包含單詞?i,總計出現次數為?yi。
數據范圍
全部的測試數據滿足?0<n,m≤100,且每篇文章至少包含一個單詞、最多不超過?100100?個單詞(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
樣例解釋
單詞?2?在:
- 文章?1中出現兩次;
- 文章?3中出現三次;
- 文章?4?中出現一次。
因此?x2=3,y2=6.
代碼
#include<bits/stdc++.h>
using namespace std;
int main()
{// n 表示文章的篇數,m 表示單詞編號的上限int n, m;// x[i] 用于記錄單詞 i 出現在多少篇文章中int x[101];// y[i] 用于記錄單詞 i 在全部文章中總共出現的次數int y[101];// t[i] 用于記錄單詞 i 上一次出現所在文章的編號// 通過比較這個編號和當前文章編號,判斷單詞是否在新文章中出現int t[101];cin >> n >> m;// a 用于存儲當前文章的長度(單詞個數)// b 用于臨時存儲當前文章中讀取的單詞編號int a, b;// 遍歷每一篇文章,n 在這里也作為文章編號,從 n 到 0while(n --){// 讀取當前文章的長度cin >> a;// 遍歷當前文章中的每個單詞for(int i = 1; i <= a ; i ++) {// 讀取當前文章中的一個單詞編號cin >> b;// 判斷單詞 b 是否在新的文章中出現// t[b] 記錄了單詞 b 上一次出現所在文章的編號// 如果 t[b] 不等于當前文章編號 n,說明單詞 b 在新文章中首次出現if(t[b] != n) {// 單詞 b 出現的文章篇數加 1x[b] ++;// 更新單詞 b 所在的文章編號為當前文章編號t[b] = n;}// 無論單詞 b 是否在新文章中出現,只要出現,其總出現次數就加 1y[b]++; }}// 遍歷從 1 到 m 的每個單詞編號for(int i = 1; i <= m ; i ++){// 輸出單詞 i 出現的文章篇數和在所有文章中的總出現次數cout << x[i] << " " << y[i] << endl;}return 0;
}