1. 程式人生 > >【JZOJ5416】密碼(口胡)

【JZOJ5416】密碼(口胡)

Description

現在身為校慶志願者的小C正在引導校友們到他們集合的教室。終於,忙了一段時間的他可以休息一會兒了。這時,旁邊一位老校友的話吸引到了他。“我後來當了一名探險家,有一次,我來到了一個地方,在正前方有一扇門,旁邊寫著一行文字:’現在給你前m個字串G,有一個拼接規律T,它是一個長度為m的一個排列,你要把現在已經得到的最後m個字串按照T的順序拼接起來,得到一個新的字串,用這種方法,你可得到第n個字串P,再給你另外一個字串S,則S在P中出現的次數就是這個門的密碼…’”聽到這裡,小C陷入了沉思:到底密碼是多少呢?不過由於小C比較討厭大數,他只想知道這個密碼除以(10^9+7)的餘數。你能幫幫他嗎?

Solution

根據資料範圍,我們發現新串匹配個數等於它前面m個的匹配個數加上按照排列接起來增加的匹配數,而且詢問的匹配串是小於原m個串的長度的,於是我們只用保留每個串前|G|1個和後|G|1個。

接著我們就暴力增加串,只記錄頭尾的前|G|1個和後|G|1個,然後會在至多m(m1)個(不會證明)就出現迴圈。

於是我們把這些迴圈節的答案記錄下來,扔進一個1sizesize為迴圈節大小)的矩陣中,於是根據迴圈節的性質,我們可以構出一個轉移矩陣。

ans1..size轉移到anssize+1,size2,矩陣乘法就好了。

Code

口胡沒有程式碼,說的輕巧,實際實現不容易。