UVa 10282
題目
http://domen111.github.io/UVa-Easy-Viewer/?10282
題目會先給你每個英文字對應到的外國文字,這群對應的字保證是一對一,形成一個字典
接下來會有多筆詢問,輸入一個外國文字,輸出相對應的英文字,如果不存在則輸出 eh
想法
這題可以直接用 map 對應,但是這裡我們用二分搜來實作看看
首先先把字典建立好,可以用一個 struct 來建立每個英文字對應到的外國字,接下來排序,方便我們查詢
最後用二分搜就可以了
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| #include<iostream> #include<sstream> #include<algorithm> using namespace std; int i=0, res, res2; string s, key, value, q;
struct word{ string key; string value; }; word dict[100010];
bool cmp(word p, word q){ if(p.value != q.value) return p.value < q.value; return false; }
int search(int l, int r, string p){ while(l!=r){ int mid = (l+r)/2; if(dict[mid].value == p) return mid; if(dict[mid].value < p) l = mid+1; else r=mid; } return -1; }
int main(){ while(getline(cin, s) && s!=""){ stringstream ss; ss<<s; ss>>key>>value; dict[i].key = key; dict[i].value = value; i++; } sort(&dict[0], &dict[i], cmp); while(cin>>q){ res = search(0, i, q); if(res == -1) cout<<"eh\n"; else cout<<dict[res].key<<"\n"; }
return 0; }
|
時間複雜度分析
假設有 $N$ 筆輸入以及 $Q$ 筆詢問
輸入時間複雜度為 $O(N)$
排序時間複雜度為 $O(NlogN)$
搜尋時間複雜度為 $O(QlogN)$
總時間複雜度為 $O(N + (N+Q)logN)$