最長雙回文串

2022-05-09 12:18:11 字數 799 閱讀 7080

題目大意:

輸入長度為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 都是回文串。輸入格式 一行由小寫英文本...