Manaherアルゴリズムのまとめ
3349 ワード
Manacher , 。
, O(n)
1)
( , , baidu)
Manacher , , s1, s2.
, s1 = "ababba",
s2 = "$#a#b#a#b#b#a#".
, , s2 , , 。 , s2[0] = '$', , 。 。 P[i] = min(P[2*id]-i),mx-i) :
, i=1,id = 0,2*id-i = -1, 。。 。
void init()
{
int i, j = 2;
s2[0] = '$', s2[1] = '#';
for(i=0;s1[i];i++)
{
s2[j++] = s1[i];
s2[j++] = '#';
}
s2[j] = '\0';
}
2)Manacher
, Manacher 。
, , 。
, P[]( s2 ), P[i] , P[i] 。 P[i]-1 。
//
12212321
, S[] = "$#1#2#2#1#2#3#2#1#";
P[i] S[i] / ( S[i], “ ” ), S P :
---------------------------------------------------------
S # 1 # 2 # 2 # 1 # 2 # 3 # 2 # 1 #
P 1 2 1 2 5 2 1 4 1 2 1 6 1 2 1 2 1
---------------------------------------------------------
(p.s. ,P[i]-1 )
, id , mx id 。
,
void manacher(char* s)
{
int i, id = 0, mx = 0;
P[0] = 0; //P[0]
for(i=1;s[i];i++) //
{
if(mx > i) // mx i , , blog ,
P[i] = min(P[2*id-i],mx-i);
else // mx i , ,
P[i] = 1;
while(s[i + P[i]] == s[i - P[i]]) P[i]++; //
if(mx < P[i] + i) // mx id
{
mx = P[i] + i;
id = i;
}
}
}
以下の参照事項を参照してください.http://www.cnblogs.com/BigBallon/p/3816890.html
最後に練習をして上手になります.
hdu 3068 poj 3796 hdu 3294 hdu 4513 hdu 5371(多校7_1003題)
問題番号を解題報告とする.探して&星空の子供