SHOI2011 雙倍回文

2022-05-10 21:58:17 字數 1123 閱讀 6243

輸入分為兩行,第一行為乙個整數,表示字串的長度,第二行有個連續的小寫的英文本元,表示字串的內容。

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

ggabaabaabaaball

12n<=500000

首先manacher求出len陣列

我們發現乙個乙個以i為中心的回文串[l,r]是雙倍回文

[i,r]也是乙個回文串,設這個串的中心為j

求出len陣列後,可以寫出條件:

$j<=i+\frac$

$i>=j-len_j$

我們發現從小到大列舉$i$(也可以從大到小列舉j,換一種列舉方式)

這樣乙個滿足$i>=j-len_j$的$j$同樣滿足$i+x>=j-len_j$

用乙個stl的set,維護j,每次找到小於$i+\frac$的最大j

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

7using

namespace

std;

8struct

node

9a[1000001

];12

sets;

13int n,loc,mx,len[1000005],po,b[1000005

],ans;

14char ch[1000005],s[1000005

];15

bool

cmp(node a,node b)

1619

intmain()

20 28 s[++loc]='

#';s[++loc]='?'

;29for (i=1;i<=loc;i++)

3040}41

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

42 a[i].x=(len[i*2+1]-1)/2,a[i].id=i,b[i]=a[i].x;

43 sort(a+1,a+n+1

,cmp);

44 loc=1;ans=0;45

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

4654 cout<4

;55 }

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。首先由題意可知,只用考慮偶數長的回文串。這樣就不用插入 直...

bzoj2342 Shoi2011 雙倍回文

傳送門 參考題解 一道很好的manacher練手題。一開始把題讀錯了,以為是w1 w 1w 2w 2 形式的就可以,題目哪有這麼簡單 觀察題目,我們可以發現 對於每乙個符合條件的子串,都有j p j i j i,p j 是以j為中心最大的 畫個圖可能更好理解 圖中綠色矩形中就是一種可行方案。所以ma...