輸入分為兩行,第一行為乙個整數,表示字串的長度,第二行有個連續的小寫的英文本元,表示字串的內容。
輸出檔案只有一行,即:輸入資料中字串的最長雙倍回文子串的長度,如果雙倍回文子串不存在,則輸出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 #include7using
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...