題目大意:
輸入長度為n的串s,求s的最長雙回文子串t,即可將t分為兩部分x,y,(|x|,|y|≥1)且x和y都是回文串。
題解:若x,y都是回文串且相鄰,則共用乙個』#『。
可以對於每個『#』找出其左邊界和右邊界。
**:
#include#include#include
using
namespace
std;
#define n 100050
char s0[n],s[2*n];
intl0,len;
int p[2*n],l[2*n],r[2*n];
void
manacher()
}}int
main()
s[++len]='#'
; s[++len]='@'
; manacher();
for(int i=3;i<=len;i+=2
) r[i]=max(r[i],r[i-2]-2
);
for(int i=len;i>=1;i-=2
) l[i]=max(l[i],l[i+2]+2
);
int ans = 0
;
for(int i=1;i<=len;i+=2
) ans=max(ans,r[i]+l[i]);
printf(
"%d\n
",ans);
return0;
}
最長雙回文串
題目描述 順序和逆序讀起來完全一樣的串叫做回文串。比如acbca是回文串,而abc不是 abc的順序為 abc 逆序為 cba 不相同 輸入長度為n的串s,求s的最長雙回文子串t,即可將t分為兩部分x,y,x y 1 且x和y都是回文串。對於 10 的資料,2 s 10 3 對於 30 的資料,2 ...
最長雙回文串
題目描述 順序和逆序讀起來完全一樣的串叫做回文串。比如acbca是回文串,而abc不是 abc的順序為 abc 逆序為 cba 不相同 輸入長度為n的串s,求s的最長雙回文子串t,即可將t分為兩部分x,y,x y 1 且x和y都是回文串。對於 10 的資料,2 s 10 3 對於 30 的資料,2 ...
最長雙回文串 manacehr
題目描述 順序和逆序讀起來完全一樣的串叫做回文串。比如 acbca 是回文串,而 abc 不是 abc 的順序為 abc 逆序為 cba 不相同 輸入長度為 n 的串 s,求 s 的最長雙回文子串 t,即可將 t 分為兩部分 x,y,x y 1 且 x 和 y 都是回文串。輸入格式 一行由小寫英文本...