【luogu P3879 [TJOI2010]閱讀理解】 題解
阿新 • • 發佈:2018-06-23
寧可 pre str 編號 ava 查詢 algo 一個空格 TE 我永遠都喜歡
題目鏈接:https://www.luogu.org/problemnew/show/P3879
我先說一句:
我永遠都喜歡StellaSTL
這個題,很明顯就是
trie樹
hash
map+vector
思路:
直接用map
用vector記錄每個單詞出現的句子位置,每遇到一個就把該單詞所出現的句子的編號壓入對應的vector裏。
於是乎= =這就是最暴力的想法。
接下來我們利用一個桶來去重就完成了題目裏的要求。(我會說我是因為沒看見這個要求第一次提交爆零嘛qaq)
Code:
#include <map> #include <vector> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 100001; int n, m, num, cnt[maxn]; string s; map<string,vector<int> >a; int main() { std::ios::sync_with_stdio(false);//要關閉同步,快很多 cin>>n; for(int i = 1; i <= n; i++) { cin>>num; for(int j = 1; j <= num; j++) { cin>>s; a[s].push_back(i);//vector的壓入操作。我每一個單詞就是一個vector。 } } cin>>m; for(int i = 1; i <= m; i++) { cin>>s; memset(cnt,0,sizeof(cnt));//cnt就是去重的桶。每用一次輸出不同的查詢要清零。 for(int j = 0; j < a[s].size(); j++)//a[s].size()是vector自動返回其長度的函數。 if(cnt[a[s][j]] == 0) { cout<<a[s][j]<<" ";//我們存的就是答案所求的所出現的句子的編號,所以直接輸出不多bb。而且存的時候也是按順序所記錄的。 cnt[a[s][j]]++;//別忘了用桶去重! } cout<<endl; } return 0; }
結尾:
我的代碼應該是很短的了,同學們應該要有利用stl的意識,但不能完全依靠stl,畢竟有很多東西也是stl現在所提供不了的。
兩個STL應用使代碼簡短了很多。然而還是那句話,天上不會掉餡餅,程序的效率還是有所下降的。然而,效率不是全部,人們寧可犧牲三倍效率用Java而不用C語言就是最好的例子(from_ Charles E Leiserson_),具體取舍要看情況。
該手打的還是要會的。trie樹還是要會的!
有什麽問題交流歡迎+QQ 935145183/3203600070
【luogu P3879 [TJOI2010]閱讀理解】 題解