1. 程式人生 > >【luogu P3879 [TJOI2010]閱讀理解】 題解

【luogu P3879 [TJOI2010]閱讀理解】 題解

寧可 pre str 編號 ava 查詢 algo 一個空格 TE

題目鏈接:https://www.luogu.org/problemnew/show/P3879
我先說一句:

我永遠都喜歡StellaSTL


這個題,很明顯就是

trie樹

hash

map+vector


思路:

直接用map > 代替這題裏的trie樹,註意開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]閱讀理解】 題解