1. 程式人生 > >HDU-5785 Manacher+區間處理

HDU-5785 Manacher+區間處理

如何得到陣列L[i]與R[i]呢,首先用Manacher預處理出以每個位置為中心的迴文串的半徑,我們發現對於每個位置i,它前面半徑內的每個位置j對應的以i為中心的迴文串的結束位置在新串中為i*2-j,我們要將這個值加到L上。這裡可以採用樹狀陣列的思想,把這個值分為兩部分i*2與j,用陣列p[i]表示半徑,bb1、bb2代表兩個標記,每次列舉i,我們只需要bb1[i-p[i]+1]+=i,bb2[i-p[i]+1]++,bb1[i+1]-=i,bb2[i+1]--即可。我們從前往後掃一遍,將bb1與bb2的值分別加到兩個和s1與s2中,這樣在每個位置s1就代表了上面那個值的第一部分,s2代表了在該位置j處需要減去j的次數。我們的L是定義在原串上的,由於新串在原串相鄰字元間插入了'#',所以在計算原串L的時候s1不需要再*2,並且奇偶的情況也得到了統一,於是對於新串上每個偶數位置i對應原串L[i/2]=s1-s2*i/2。同理,可以計算出陣列R,總體複雜度為O(n)。