第一題一輩子過不了系列
這次考試又學到了許多新東西,受益匪淺
但是成績依舊不夠理想,第一題又炸了,明明好好的一道打表題都打錯了,身敗名裂
以後還是繼續鞏固一下這些零零散散的知識,否則考試犯了錯找不出來要浪費好多時間
好數【問題描述】
nodgd認為,如果乙個數的三進製表示裡數字1的個數和數字2的個數一樣多,那就是好數。現在nodgd想知道不小於n的最小的m個好數,你快告訴他。
【輸入格式】
輸入檔案a.in。
第一行包含有乙個整數t,表示nodgd提問的次數。
接下來t行,每行兩個十進位制表示的整數n,m,表示nodgd的一次提問。
【輸出格式】
輸出檔案a.out。
對每次提問輸出一行,包含m個由小到大排列的十進位制表示的整數,兩個數之間用空格隔開(注意,行末也應該有乙個空格,不然可能會出現一些莫名其妙的錯誤),表示nodgd的這次提問的答案。
【樣例輸入】
41 5
100 5
10000 5
1000000 5
【樣例輸出】
5 7 11 15 19
104 106 116 128 132
10016 10019 10023 10034 10035
1000003 1000009 1000011 1000026 1000031
【樣例解釋】
第一次提問中,5的三進製表示是12,7的三進製表示是21,11的三進製表示是102,15的三進製表示是120,19的三進製表示是201。
【資料範圍】
對於50%的資料,1≤n≤100,m≤10;
對於100%的資料,1≤n≤10^6,m≤100,t≤100
這題看起來很複雜,但是認真分析就會發現,n的範圍並不大,並且由於求的數字具有特殊性,所以打表是乙個很現實的做法,實際上打表是真的能過的,雖然時間效率相對較低但是比較平均,最後打出來的表也就10w左右
最後注意縮小一下常數,因為打表幾乎是卡著時間過的,常數大一點就爆了
#include#include#includeusing namespace std;
int t,n,m,s[155000],tot,f[20];
int main()
if(cnt1==cnt2)s[++tot]=i;
} cin>>t;
while(t--)
}
好文章【問題描述】
nodgd寫了一篇文章,自認為這是一篇好文章。nodgd的文章由n個小寫英文本母組成。文章的乙個子串指的是文章中的一段連續的字母,子串的長度就是這一段的字母個數。nodgd在文章中用了排比、對偶、前後照應之類的手法,所以就有很多個子串是相同或者相近的。為了向大家證明這是一篇好文章,nodgd決定給自己的文章進行評分。nodgd首先確定了乙個整數m,然後統計出文章中有多少個不相同的長度為m的子串,這個數量就是文章的評分。
然而,nodgd懶得老老實實計算這個評分了,就把任務丟給了你。
【輸入格式】
輸入檔案b.in。
第一行包含兩個整數n,m,表示文章的長度和需要統計的子串長度。
第二行包含乙個長度為n的只包含小寫字母的字串。
【輸出格式】
輸出檔案b.out。
輸出一行乙個整數,表示文章的評分。
【樣例輸入1】
5 3aaaab
【樣例輸出1】
2【樣例解釋1】
長度為3的子串有3個,分別是aaa,aaa,aab,其中不同的只有2個。
【樣例輸入2】
9 3abcabacba
【樣例輸出2】
7【樣例解釋2】
共有7個長度為3的子串,每個長度為3的子串都不同。
【資料範圍】
對於30%的資料,1≤m≤n≤200;
對於50%的資料,1≤m≤n≤2000;
對於另外20%的資料,1≤m≤50≤n≤200000;
對於100%的資料,1≤m≤n≤200000
這是一道非常有價值的題,不在於題目本身是多麼的難,多麼的經典,而是其中蘊含的演算法的優化和改進是平常做題中沒有涉及到的,但卻是非常重要的
首先可以想到用set,map加上substr來搞,能過50分
然後我們發現這些東西都是非常費時的,最費時的就是乙個乙個列舉子串
因此我們想到用字串hash,既能在o(n)時間內推算出每乙個子串的hash值,又能夠直接判斷答案
但是單純的字串hash只能過70分,原因很簡單,資料裡出現了卡hash的資料
我們知道,選擇hash的種子時一般都會選擇1e9+7這樣的質數,但是問題就在於其自然溢位
如果選擇了乙個種子為b,我們很容易知道字串的編號就在[0,b-1]區間中,但是出題人如果比較厲害並且很無聊,就會出資料卡這種種子,因為某些特殊的字串會使得每乙個子串不聚集的概率為%0.06左右
所以我們明白,選擇的種子過小了,實際上如果保證正確率在%99以上,需要選擇的種子必須大於1e15,但這顯然是不現實的
所以這裡我們可以選擇開兩個hash表,然後給同乙個字串附上兩個hash值,在判斷兩個字串是否相同時,必須兩個hash值都相同才行
最後再說幾句:
第二題是真的不錯,時隔多日仍然記得其機智的雙hash,這也是非常實用的做法,以後再也不怕hash被卡了!
然而第一題表打錯了簡直痛心疾首……身敗名裂啊!
繼續加油吧……
NOIP2015模擬11 5 旅行
經過觀察,可以發現題目有乙個比較不錯的性質 1 一條合法的路徑必須由兩條路徑組成,一條是奇數,另一條是偶數。所以我們可以先把每乙個點到達根節點的路徑求出來,深度為奇數的點放進乙個a aa陣列裡,偶數的放進b bb陣列裡,再給他們分別進行排序。然後進行兩兩結合,先把a陣列裡的所有數跟b1b b1 結合...
NOIP2015模擬11 3 裝飾大樓
給出乙個序列a,ai表示對於乙個h序列來講,以i結尾的lis的長度。h中的數兩兩不等。現在你知道了a刪去乙個數之後的序列b 未知刪掉哪位 求a序列有多少種。a 10 6 好多細節呀!不爽,懶得打題解。可以發現,對於乙個序列a,它滿足條件的前提就是,對於每乙個ai,都存在乙個aj j i 滿足aj 1...
NOIP2015模擬11 3 備用鑰匙
你知道just odd inventions社嗎?這個公司的業務是 只不過是奇妙的發明 just odd inventions 這裡簡稱為joi社。joi社有n名員工,編號從1到n。所有員工的工作時間從時刻0持續到時刻m,時刻0和時刻m的時候,所有員工都必須在公司內。某天,出於巧合,joi社的每個員...