題目描述
英語老師留了N篇閱讀理解作業,但是每篇英文短文都有很多生詞需要查字典,為了節約時間,現在要做個統計,算一算某些生詞都在哪幾篇短文中出現過。
輸入輸出格式
輸入格式:
第一行為整數N,表示短文篇數,其中每篇短文只含空格和小寫字母。
按下來的N行,每行描述一篇短文。每行的開頭是一個整數L,表示這篇短文由L個單詞組成。接下來是L個單詞,單詞之間用一個空格分隔。
然后為一個整數M,表示要做幾次詢問。后面有M行,每行表示一個要統計的生詞。
輸出格式:
對于每個生詞輸出一行,統計其在哪幾篇短文中出現過,并按從小到大輸出短文的序號,序號不應有重復,序號之間用一個空格隔開(注意第一個序號的前面和最后一個序號的后面不應有空格)。如果該單詞一直沒出現過,則輸出一個空行。
輸入輸出樣例
輸入樣例#1:
3
9 you are a good boy ha ha o yeah
13 o my god you like bleach naruto one piece and so do i
11 but i do not think you will get all the points
5
you
i
o
all
naruto
輸出樣例#1:
1 2 3
2 3
1 2
3
2
說明
對于30%的數據,1 ≤ M ≤ 1,000
對于100%的數據,1 ≤ M ≤ 10,000,1 ≤ N ≤ 1000
每篇短文長度(含相鄰單詞之間的空格) ≤ 5,000 字符,每個單詞長度 ≤ 20 字符
每個測試點時限2秒
這好像是個trie樹的題目,但是蒟蒻的我已經忘了,但仔細想一想其實不用trie樹,只用map,vector就可以了!
對于輸入按照string型輸入,因為我并不會用map套vector,所以我對于每個單詞映射成一個數字,每當一行出現該單詞時就將該行存入該vector下,在查詢時就查詢該單詞映射下數字的vector中存儲的所有數字,同時因為一行可能同時出現多次一個單詞所以需要進行判重。
代碼:
#include<iostream>
#include<cstdio>
#include<map>
#include<vector>
#include<cstring>
using namespace std;
int n,m,cnt;
int flag[500000];
map<string,int>match;
vector<int>G[100010];
int main(){cin >> n;for(int i = 1; i<=n; i++){int opt ;cin >> opt ;for(int j = 1; j<=opt; j++){string op;cin >> op;if(!match[op]){cnt++;match[op] = cnt;//映射成數字G[cnt].push_back(i);}else {G[match[op]].push_back(i); }}} cin >> m;for(int i = 1; i<=m; i++){string opt;cin >> opt;memset(flag,0,sizeof(flag));for(int j = 0; j<G[match[opt]].size(); j ++){if(flag[G[match[opt]][j]])continue;//判重flag[G[match[opt]][j]] = 1;cout << G[match[opt]][j] << ' ';}cout <<'\n';}return 0;
}