2012年8月27日星期一

週末,當一切不如意時

「我的心你要稱頌耶和華,不可忘記祂的恩惠」

突然,這一首詩歌很打動我的心。出自詩篇103篇,卻突然在需要時出現在教會崇拜的程序裏。當我們面對一切的困難時,當一切都不如意時,又或處於低谷時,有否忘記過神的恩惠?祂以往在你身上所作的事,今天不是還實實在在的出現過嗎?那一天,你願意去感恩,今天為甚麼就不願去感恩?

原來,「因為離了我,你們就不能作甚麼」,這個「我」是指神,一切都出自神。當我們還以為一切機會、一切成績都是自己的努力掙取回來,卻發現原來沒有那位神,我們還是甚麼也不能作。試想想,為甚麼今天你還是健康的坐在家中,看著這個無名日記?是因為你幸運,沒有病痛嗎?是因為你聰明,得到良好的基因遺傳,因而有機會看懂中文字嗎?是因為你高貴,所以可以生在這個自由上網的地方嗎?

像那小男孩的餅和魚,讓我獻給主。
就算多寒微,祂不介意。
無論是多少,全是不緊要。
在我主手中,一切也奇妙。

2012年8月12日星期日

Codeforces #129D - Little Elephant and Retro Strings

Link: http://www.codeforces.com/contest/204/problem/D

今天終於完成了一道卡了很久的題,一條關於DP和少量combinatorics的題。這一題其實有一點像那時候Lucky Pair的概念。

說說題解吧,雖然主要是根據tutorial入面的做法,但細節上很多要處理。

大體想法是不想重覆計算黑白字串的數目,所以黑和白分別用state來表示,fb(pos)代表在pos的時候,包括pos在內的左邊都不含連續k個黑 [反之便是,fw(pos)代表右邊不含連續k個白],這是Step 1。

之後便可以利Step 1的結果,知道gb(pos)︰包括pos在內,往左數k個字符都是黑,且左邊不可以有任何連續k個黑的字串 (i.e.不可能連續k+1個黑);白色照樣以gw(pos)表示,同樣左右換轉。這是Step 2。

有了Step 2的結果,便可以滾動的形式,計算最終答案。這是Step 3。

下面是每一個Step的細節。

Step 1:
很明顯,當字串是1-based,fb(0) = 1 (一個空字串不可能有連續k個黑)。假設fb(pos-1)是對的,接著看fb(pos)。如s[pos]是X,fb(pos) = fb(pos-1)*2,否則fb(pos) = fb(pos-1),這一部份易懂。

(1) 如果在最後k個字符包含一個必為白的字符,那就不用做任何減法,任何選法都不可能造成連續k個黑。
(2) 如果pos-k個字符是黑,這也不用減法,因為當後面全是黑色時,便會有連續k+1個黑,不符fb的原則。
(3) 否則便要把最後k個都是黑的可能性減去,即是fb(pos) -= fb(pos-k-1)。
(4) 一個例外,便是當pos = k時,也要減去1。

細心留意(1),要precompute多一樣東西,便是sumw(pos),代表由1到pos之間有多少個白色,這樣才可以在O(1)時間完成。

Step 2:
有了fb和fw,很容易便知道gb(pos),即最後有k個連續黑,且之前皆沒有其他的連續k個黑。這個數即是fb(pos-k),而後面只有一種方法令全是黑。

注意數種情況︰
(1) 如當中其中一個必為白,gb(pos) = 0。
(2) 如s[pos-k]為黑,那gb(pos) = 0,原因同Step 1的(2)一樣。
(3) 如s[pos-k]為X,那gb(pos) = fb(pos-k-1),原因和Step 1的(3)一樣。

Step 3:
由於字串長度可達1000000,所以要快速結合gb和gw的結果。

頹方法是先fix了gb和gw,再把乘積加起來。

for (int i=k; i<n; i++)
    for (int j=i+1; j<=n-k; j++)
        ret += gb[i]*gw[j]*num_of_X_between(i,j);

但這是O(N^2),所以我們可以倒轉來做。Fix了一個gb(pos),再以total儲存後面所有valid的gw的可能性,以滾動方式乘以gb(pos),達致O(N)。

注意,當total遇到X時,全部乘以2,再加上gw(pos)。寫出來大約是︰

for (int i=n-k-1; i>=k; i--) {
    if (s[i] == 'X') total *= 2;
    total += gw[i+1];
    ret += total * gb[i];
}

這樣就完成了!

2012年7月23日星期一

日記

7月23日
終於,大概一個月之後,把剩下的所有日記都上載了。最後一次,是說在挪威的最後一個星期。由Oslo,到Bergen,再回到朋友家,最後,慢慢的回到香港。

正如最後一篇所說的,我也不知道會不會有後記的出現,我也不敢保證甚麼。但我相信,這一系列的日記,164天在歐洲,會是一個很好很好的回憶。

Tilburg的市郊,單車的旅程,初春,3月21日


2012年7月21日星期六

小事

回來了大概已經一個月,過得最開心的,大概就是這兩天。

7月19日

人大了,也許更明白親情的可貴。原來,她今年84歲了,雖然有輕微的腦退化症,但其實相比其他相約年紀的人,已經算是很健康。細說當年,那時候的人情味,一幅又一幅的照片,洋溢著歡樂的氣氛,渲染力很強。可是,這個後來自殺,那個因病去世。人又何能長生不老?

蹣跚的腳步,一步一步的走。可能她以為做的不多,卻深深讓我感到那一種充份的愛。想得太遠,令人難過,但心底裏卻知道這一刻終有一天會來臨。

時間不等人,一點一滴的逝去,卻帶來一些新的希望。

真的,很希望對身邊的人更好,因為相處的機會,會因著時間的流逝而減少。即使以後被遺忘,卻可以把一點點的心思放在這個世界上,雖然找不到蛛絲馬跡,但已經滿足了。「未來」,是一個很虛無的名詞,沒有人能夠掌握。今天的放榜便正正說明了這事實。即使你放了11分精力下去,能保證自己有好成績嗎?即使你每一次作文都是全班最高分,能保證今次會合格嗎?

7月20日

放開了一切憂慮,原來,快樂的地圖就在不遠處。書展,想不到可以這樣的玩法。似乎,今年的策略很成功。

吹著海風,看著八仙嶺的起伏,心曠神怡。「白日,太陽必不傷你;夜間,月亮必不害你。」「自從造天地以來,神的永能和神性是明明可知的,雖是眼不能見,但藉著所造之物就可以曉得,叫人無可推諉。」

就是這麼簡單!

2012年6月25日星期一

TLife (164) - Airport


明天這個時候,大概已經到家了。原來,不知不覺,便是有Tilburg標籤的最後一篇日記。一直可以記著所發生的一點一滴,覺得自己很幸運,經歷了很多。

回港

沒有錯,正如標題所說,要回香港了。

原本打算在挪威整理一下這半年的時間,但這兒的節目太精彩了。不要緊,我會在香港做的!一大堆︰Heidelberg, Rothenburg, Nürnberg, Budapest, Prague, Berlin, Ås, Oslo, Bergen, Hankø,原來短短一個月便到了這麼多的地方,哈哈,你們拭目以待吧。

行李都收拾好,只剩的便是等待了。三個難關︰到機場的火車,大量改路,以巴士代替火車;在機場的check in,希望不要過重;在Amsterdam的離境,都不知道會不會因為沒有visa有些麻煩。之後便是香港了!

明天見。

2012年6月24日星期日

TLife (163) - Hankø


期待已久的Hankø之旅,終於來到。雖然已經來到尾聲,但這一天卻是整個挪威之旅的重要的一天。