好吧,我承認這題很簡單(不會STL的孩子把這句話無視),看錯題目導致成功掛零。。。無語死了。。。
今天的250不是很難,要點有:
1。對字串的切割,手寫切割函數比較保險,當然會用STL的字串流的可以直接按照空格切割。
2。尋找關鍵字,嗯,這裡有個好技巧,用紅/黑樹狀結構(set)來維護全部的危險關鍵字即可。
3。判斷條件,只有當危險關鍵字超過定值的時候才是危險網站,否則不是。
4。當一個網站是危險網站的時候,他的全部關鍵字都是危險的,這時候,我們要把全部的關鍵字加入紅/黑樹狀結構中管理。
5。由於4的原因,要掃描N次(類似貝爾曼福德演算法),加入的順序就不是原來的順序了,這裡在最後對其id進行一次排序,
可以用一個映射map來儲存下標。
My Code(核心部分):
set<string> st;<br />map<string,int> id;<br />bool use[60];</p><p>bool comp(const string& a,const string& b)<br />{<br />return id[a]<id[b];<br />}</p><p>bool check(const string& key,int num)<br />{<br />int len=key.length();<br />string ret;<br />vector<string> v;<br />int cnt=0,size=0;</p><p>for(int i=0;i<len;i++)<br />{<br />ret="";<br />while(i<len&&key[i]!=' ')<br />{<br />ret+=key[i];<br />i++;<br />}<br />v.push_back(ret);<br />}<br />size=v.size();</p><p>for(int i=0;i<size;i++)<br />if(st.find(v[i])!=st.end())<br />{<br />cnt++;<br />}</p><p>if(cnt>=num)<br />{<br />for(int i=0;i<size;i++)<br />st.insert(v[i]);<br />return true;<br />}<br />else<br />return false;<br />}</p><p>class InternetSecurity<br />{<br />public:<br />vector <string> determineWebsite(vector <string> add, vector <string> key, vector <string> dang, int num)<br />{<br />int n=add.size();<br />vector<string> v;</p><p>memset(use,0,sizeof(use));<br />id.clear();<br />st.clear();<br />for(int i=0;i<n;i++)<br />id[add[i]]=i;<br />int size=dang.size();<br />for(int i=0;i<size;i++)<br />st.insert(dang[i]);</p><p>for(int k=0;k<n;k++)<br />for(int i=0;i<n;i++)<br />if(!use[i]&&check(key[i],num))<br />{<br />use[i]=true;<br />v.push_back(add[i]);<br />}</p><p>sort(v.begin(),v.end(),comp);<br />return v;<br />}<br />};
總結:看題仔細,不要因為題目難懂就囫圇吞棗,最近開始討厭看題,這是不好的現象。