0%

2025-钉耙编程-中国大学生算法设计暑期联赛(9)——1006括号匹配(manacher 解决的是最长回文子串问题)

思路讲解

不难发现,合法字符串必须包含 ()() 字符。

于是套用manacher就行,注意特判radius=1的奇数长度回文串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
FOR(i,0,SZ(res)-1){
ll radius=res[i];radius/=2;
if(i&1){

if(radius<2) continue;
ll id1=i/2,id2=i/2+1,l=id1-radius+1,r=id2+radius-1;
// l=max(ban[id1]+1,l);
// r=min(Fban[id2]-1,r);
ll lans=0;
if(Pos[id1]!=-1){
if(Pos[id1]>=l){
lans=max(lans,Pos[id1]-l+1);
}
}
if(Fpos[id2]!=-1){
if(Fpos[id2]<=r){
lans=max(lans,r-Fpos[id2]+1);
}
}
ans+=lans;
}else{
if(radius<2) continue;
ll id=i/2;
ll l=id-radius+1,r=id+radius-1;
// l=max(ban[id]+1,l);
// r=min(Fban[id]-1,r);
ll lans=0;
if(Pos[id]!=-1){
if(Pos[id]>=l){
lans=max(lans,Pos[id]-l+1);
}
}
if(Fpos[id]!=-1){
if(Fpos[id]<=r){
lans=max(lans,r-Fpos[id]+1);
}
}
ans+=min(radius-1,lans);
}
}

AC代码

https://acm.hdu.edu.cn/contest/view-code?cid=1180&rid=12078

心路历程(WA,TLE,MLE……)

image