hdu 3068 最長回文

2021-06-22 03:29:19 字數 806 閱讀 9775

核心思路: rad[i]=min(rad[2*id-i],maxid-i)

其實很好理解,也就是假設你在id這個點匹配到maxid都是回文的。然後你現在搜尋的這個點i不超過maxid。

那麼i關於id的對稱點2*id-i 一定在id左邊。然後其實就是對稱點向左邊延伸,i向右邊maxid延伸。能延伸就說明是對稱的,所以取最小值。

其實就是類似於dp的乙個小優化!

#include"cstdio"

#include"iostream"

#include"cstring"

#include"algorithm"

#define n 110005

using namespace std;

char a[n],b[n*2];

int rad[n*2]; // rad[i]代表以i為中心的最大回文半徑

int main()

len=2*i;b[0]='?'; b[1]='#'; b[len]='\0'; // 防越界 頭尾區別

maxid=id=0;

maxl=0;

for(i=1;ii) rad[i]=min(rad[2*id-i],maxid-i); // 利用對稱性優化複雜度

else rad[i]=1;

while(b[i-rad[i]]==b[i+rad[i]])

if(rad[i]+i>maxid)

if(rad[i]>maxl) maxl=rad[i];

}printf("%d\n",maxl-1);

}}

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之間由空行...