hdu 3068 最長回文

2021-09-20 03:14:50 字數 1243 閱讀 3786

給出乙個只由小寫英文本元a,b,c…y,z組成的字串s,求s中最長回文串的長度.

回文就是正反讀都是一樣的字串,如aba, abba等

輸入有多組case,不超過120組,每組輸入為一行小寫英文本元a,b,c…y,z組成的字串s

兩組case之間由空行隔開(該空行不用處理)

字串長度len <= 110000

每一行乙個整數x,對應一組case,表示該組case的字串中所包含的最長回文長度.

aaaa

abab43

這是乙個典型的馬拉車演算法題,直接用馬拉車演算法即可。關於馬拉車演算法,可以看上乙個博文,有詳細介紹。

對於輸入的字串,先要處理一下,變成奇數長度,也就是在每乙個字元前後都插入字元「#」,另外在開頭和結尾還也可插入特殊的字元,如「&」和「@」。

假設原字串在tem中,處理後的字串在s中,**如下:

l=2*

strlen

(tem+1)

+1;//l處理後串長度,是原串長度的2倍+1,

s[0]

='&'

;//開頭插入乙個「&」

s[l+1]

='@'

;//結尾插入乙個「@」

for(i=

1;i<=l;i++)//

if(i&

1) s[i]

='#'

;//當前位置i與數字1做按位與操作,奇數字置插入「#」

else s[i]

=tem[i/2]

;//偶數字置插入原串中字元

馬拉車演算法的主要內容就是對處理後的字串,計算每乙個p[i],**和標準的馬拉車演算法一樣,就不贅述了,看看完整**:

#include

#include

//-----計算x、y的最小值------

intmin

(int x,

int y)

//-----計算x、y的最大值------

intmax

(int x,

int y)

int p[

230000];

char s[

230000

],tem[

230000];

//tem是輸入的原始串,s是加入#的串

intmain()

}printf

("%d\n"

,ans);}

}

HDU 3068 最長回文

題 目 鏈 接 看完後自己寫了一遍,感覺真的是很神奇的結論啊!本來這題看到可以用字尾陣列來寫的,但沒有學過,去看了一下,真心給暈了,決定找個機會認真研究下。我的 include include includeusing namespace std define min a,b a b a b cha...

HDU 3068 最長回文

存在o n 的演算法,學習了一下 include include includeusing namespace std const int maxn 300011 int n,p maxn char str maxn in maxn int main str 0 str 1 n n 2 2 str ...

HDU 3068 最長回文

problem description 給出乙個只由小寫英文本元a,b,c.y,z組成的字串s,求s中最長回文串的長度.回文就是正反讀都是一樣的字串,如aba,abba等 input 輸入有多組case,不超過120組,每組輸入為一行小寫英文本元a,b,c.y,z組成的字串s 兩組case之間由空行...