bzoj 2342 Shoi2011 雙倍回文

2022-05-11 12:03:04 字數 1128 閱讀 8019

輸入分為兩行,第一行為乙個整數

,表示字串的長度,第二行有

個連續的小寫的英文本元,表示字串的內容。

輸出檔案只有一行,即:輸入資料中字串的最長雙倍回文子串的長度,如果雙倍回文子串不存在,則輸出0。16

ggabaabaabaaball

12n<=500000

題解:

先manacher求出f陣列,然後顯然我們列舉中點x如果把x-y作為第三段,那麼 y-f[y]<=x && y<=x+f[x]/2 即可滿足

於是我們以y-f[y]排序乙個陣列,維護乙個set,然後每次放入y-f[y]<=i

顯然 y越靠近x+f[x]/2答案越大,我們就找x+f[x]/2的前驅即可

1 #include2 #include3 #include4 #include5 #include6 #include

7using

namespace

std;

8const

int n=1000005;9

char s[n],s[n];int

f[n],d[n];

10struct

node

13}a[n];

14set

t;15int

main()

1626 s[++l]='#'

;27int id=1;28

for(int i=1;i<=l;i++)

34 n=0;35

for(int i=3;i<=l;i+=2)d[++n]=(f[i]-1)>>1;36

for(int i=1;i<=n;i++)a[i].id=i,a[i].x=i-d[i];

37 sort(a+1,a+n+1

);38

int p=0,ans=0

,x;39

for(int i=1;i<=n;i++)

45 printf("

%d",ans<<2

);46

return0;

47 }

雙倍回文 Shoi2011 bzoj2342

time limit 10 sec memory limit 128 mb submit 2820 solved 1088 submit status discuss 輸入分為兩行,第一行為乙個整數,表示字串的長度,第二行有個連續的小寫的英文本元,表示字串的內容。輸出檔案只有一行,即 輸入資料中字串...

bzoj 2342 Shoi2011 雙倍回文

題目大意 演算法一 因為雙倍回文串必定是乙個回文串 所以先用manachar求出每個點能夠擴充套件出的最長的回文串長度f i 再列舉對稱軸x,對於y只要滿足y f y x y x f x 2,就可以用len x,y 4來更新答案 對於每個x,只需要用距離其最遠的滿足條件的y來更新即可 將其按i f ...

SHOI2011 bzoj2342 雙倍回文

description input 輸入分為兩行,第一行為乙個整數,表示字串的長度,第二行有個連續的小寫的英文本元,表示字串的內容。output 輸出檔案只有一行,即 輸入資料中字串的最長雙倍回文子串的長度,如果雙倍回文子串不存在,則輸出0。首先由題意可知,只用考慮偶數長的回文串。這樣就不用插入 直...