[分形]GYM-100443

第i階的圖形由第i-1階的圖形構成,大概過程直接看題目裏的圖即可。

然後從圖形左端進去,右端出來,中間左拐得到字符L,右拐得到R。走完之後得到一個字符串。現在給定n和字符串S,問字符串S是不是n階圖形字符串的子串。

經觀察,所有的i階圖形都是可以被包裹在一個三角形裏面,所以複製的時候,兩個i-1階圖形這個姿勢是不會交叉的(但是可能會有點重合),並且對於倆i-1階圖來說,相當於是從倆方向進入同一個圖形,所以,令str(i)表示i階圖形的字符串,str(
i)=str(i-1)+"L"+~rev(str(i-1)),其中rec()表示左右反轉一下,~表示原先的L變成R,R變成L。

我們考慮對於i階圖形來說,如果S是它的子串,當S不經過str(i)的中心L可以得到的時候,就變成了一個子問題;如果經過中心,因爲S長度<=100,則我們只查詢str(i)中間2*len(S)+1位,一定能找到S。

遞歸做也可以,然,我是自底向上寫的。

維護第i階圖形(1<=i<=n)的開頭len(S)位,中間2*len(S)+1位,結尾len(S)位,先用KMP看看中間能不能找到S,找不到的話用ed(末尾的)得到第i+1階圖形的中間2*len(S)位,用bg更新第i+1階圖形的ed。其實到了後面就不變了,因爲bg永遠不變的,但是懶得想太細,更新也不會錯不會T就是了。

還有一個細節就是,如果中心找不到,可能在str(i-1)裏,也可能在~rev(str(i-1))裏,所以呢,第i階的時候可以得到i-1階的~rev(str(i-1)),我們直接用str(i-1)和~rev(S)跑KMP匹配一下看看就可以了。注意不能在i-1階的時候匹配str(i-1)和~rev(S),因爲如果i>n了,~rev(str(i-1))是得不到的。

最終複雜度是n*200*T差不多?這個複雜度分析有點草率了=-=

代碼的話……vj進不去了,之後能進了再補上吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章