【csp202403-1】詞頻統計【第33次CCF計算機軟體能力認證】

SAKURA12發表於2024-05-25

問題描述

在學習了文字處理後,小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是否出現過,最後遍歷一遍統計每一篇文章中出現過的單詞數

 1 #include <cstdio>
 2 int n,m,l[105],cnt[105];
 3 bool vis[105][105];
 4 int main()
 5 {
 6     int i,j,x;
 7     scanf("%d%d",&n,&m);
 8     for (i=1;i<=n;i++)
 9     {
10         scanf("%d",&l[i]);
11         for (j=1;j<=l[i];j++)
12         {
13             scanf("%d",&x);
14             cnt[x]++;
15             vis[i][x]=1;
16         }
17     }
18     int s;
19     for (i=1;i<=m;i++)
20     {
21         s=0;
22         for (j=1;j<=n;j++)
23           if (vis[j][i])
24             s++;
25         printf("%d %d\n",s,cnt[i]); 
26     }
27     return 0;
28 }

相關文章