題目分析:首先觀察到集集合 A 中那個(gè)套娃的表示,外層的范圍是 [ x1 , y1 ] ,內(nèi)層是 [ x2 , y2 ] ,而內(nèi)層的定義域?qū)嶋H上是包含在外層的定義域內(nèi)的,這樣外層的函數(shù) f 其實(shí)是不起作用的,因?yàn)閮?nèi)層的函數(shù) f 已經(jīng)按照規(guī)則將區(qū)間集合 A 中 [ x1 , y1 ] 內(nèi)的每個(gè)元素按照規(guī)則轉(zhuǎn)換完畢了,再進(jìn)行一次相同的轉(zhuǎn)換,則就變的可有可無(wú)了,換句話說(shuō),每一個(gè) f( S , x1 , y1 ) 實(shí)質(zhì)上表示為字符串 s 的每個(gè)子串經(jīng)過(guò) f 函數(shù)轉(zhuǎn)換后的字符串,這樣題意就變成了求所有子串經(jīng)過(guò) f 函數(shù)的轉(zhuǎn)換后,有多少個(gè)本質(zhì)不同的字符串
上面轉(zhuǎn)換后的題意還不夠直接,通過(guò)觀察可以發(fā)現(xiàn),假設(shè)字符串 s 在經(jīng)過(guò) f 函數(shù)的轉(zhuǎn)換后,得到新的字符串記為 ss ,不難看出字符串 s 的一個(gè)前綴在經(jīng)過(guò) f 函數(shù)的轉(zhuǎn)換后,得到的仍然是 ss 的前綴
參考后綴與子串的關(guān)系,可以將所有的子串表示為任意一個(gè)后綴的前綴,同樣題意轉(zhuǎn)換為了所有經(jīng)過(guò) f 函數(shù)轉(zhuǎn)換后的后綴中,有多少個(gè)本質(zhì)不同的子串
這樣題意就轉(zhuǎn)換為了求 f( S , i , n ) ,i ∈ [ 1 , n ] ,求 n 個(gè)串中本質(zhì)不同的子串,這個(gè)可以借助廣義后綴自動(dòng)機(jī)來(lái)完成,但是如果暴力為 n 個(gè)串建立 sam 的話,時(shí)空復(fù)雜度都會(huì)爆掉,再根據(jù) f 函數(shù)的性質(zhì)來(lái)考慮,可以發(fā)現(xiàn),因?yàn)樽址拇笮?10,所以任意一個(gè)位置的字符,至多會(huì)被更新 9 次,最極端的情況下,假設(shè)字符串為 dcbaaa...aaa,后綴的長(zhǎng)度從小到大可以表示為:
a
aa
aaa
......
aaa...aaa
bbbb...bbb
ccccc...ccc
ddddd...ddd
這是最極端的情況,這樣整體建立廣義 sam 的時(shí)空復(fù)雜度也不會(huì)超過(guò) 10N
在建立廣義 sam 時(shí),可以借助序列自動(dòng)機(jī)來(lái)實(shí)現(xiàn),普通的序列自動(dòng)機(jī) nx[ i ][ j ] 記錄的是位置 i 后(包括)首次出現(xiàn)字母 j 的位置,在本題中需要轉(zhuǎn)換為:nx[ i ][ j ] 表示為記錄位置 i 后(包括)首次大于等于字母 j 的位置,這樣對(duì)于第 i 個(gè)位置的字母 j 來(lái)說(shuō),只需要暴力更新一下 [ i , nx[ i ][ j ] - 1 ] 就好了,nx[ i ][ j ] 往后的位置都可以直接從前面維護(hù)的 trie 樹中拉下來(lái)繼續(xù)用