博客地址:http://www.javashuo.com/article/p-hzgqbpox-gp.htmlhtml
大學期間,你老是點子不少,你利用申請的專利,開了一家互聯網公司,爲客戶提供高效、快捷的服務。有一天,訂單量忽然大漲,欣喜之餘,祕書卻告訴你,今天的營業額跌到谷底,客服電話被打爆。你發現,看似不少的訂單請求,其實只是給你發了一個「hello」而已,服務器忙於應付大量的hello, 已經沒辦法給原有用戶提供正常的服務了,基本處於癱瘓的狀態。通過討論,多是受到了黑客的DDos(分佈式拒絕服務)攻擊。黑客經過發送大量的無用的請求信息,佔用你的服務器資源,讓服務器無法給用戶提供正常的服務。c++
當務之急,是先恢復服務器,把攻擊你的黑客都拉進黑名單,讓服務器不要理會這些請求。第一步,就是要把黑客檢測出來。你須要對請求進行審查,找出其中有問題的請求,而後把發送方拉黑。這些請求長這個樣子:發送方的名字由4個小寫英文字母組成,後面跟着接收方和請求信息的大小,你能夠經過請求信息的大小推測請求的內容。git
你的服務器就是那個可憐的Bob,而發送方有不少,有的是普通用戶,而有的就是黑客了。很明顯,黑客在短期給你發了大量的信息,發送方中的 abcd 就頗有多是黑客,由於他在短期內給你發了不少信息量很小的請求(64,極可能只有hello),並且這些請求值總值已經超過了1500。本着寧錯殺一千,不放過一個的原則,只要總的請求信息的大小超過T=1500,就把它拉黑。github
編程語言不限編程
學習基本的文件讀寫
讀提供的文件Request.txt
把裏面的內容寫到output.txt安全
根據提供請求的輸入Request.txt,把全部請求和對應的信息大小都存下來。
統計每一個發送方的總請求大小S,S超過T的就認定爲黑客,把他們的名字存進你的黑名單裏。
輸出黑客的個數,和這些黑客的名字。
例如:示例中有28個請求,其中abcd發了25個請求,這些請求的總和S是1600>1500=T,因此abcd被認爲是黑客,就把abcd加到你的黑名單裏去。服務器
如今你已經暫時恢復了服務。但你發現,1的方法很笨,例如:把全部請求都存下來,再統計總值,花費了你大量的存儲空間。這裏麪包含了不少沒必要要的操做,有不少缺點。
吐槽1方法,找到這個方法的問題。給出你的方法,不必定是完美的,說出方法的優缺點,只要能自圓其說。(能夠從速度、佔用的空間、準確率等方面思考)
選作:實現你的方法。網絡
輸入:
名字和信息大小用一個空格隔開,每條信息用一個換行隔開編程語言
lhyy bob 100 hzrr bob 700 cyxx bob 364 lhyy bob 700 lhyy bob 800 zzyy bob 300 zzyy bob 800 zzyy bob 600
輸出:
第一行輸出黑客的總個數,第二行輸出黑客名,每一個黑客名用一個換行隔開分佈式
2 lhyy zzyy
#include<bits/stdc++.h> using namespace std; const int T=1500; int main(){ freopen("Request.txt","r",stdin); freopen("output.txt","w",stdout); map<string, int> request_sum; string request_name,server_name; int request_num,blacklist_size=0; while (cin>>request_name>>server_name>>request_num) { if (request_sum[request_name]<=T) { request_sum[request_name]+=request_num; if (request_sum[request_name]>T) { blacklist_size++; } } } map<string, int>::iterator it; printf("%d\n",blacklist_size); for (it=request_sum.begin(); it!=request_sum.end(); it++) { if ((it->second)>T) { cout<<it->first<<'\n'; } } fclose(stdin); fclose(stdout); return 0; }
GitHub:https://github.com/Echohat/031802319/tree/master/second