最長雙回文串

2021-09-16 23:35:04 字數 1253 閱讀 9651

題目描述

順序和逆序讀起來完全一樣的串叫做回文串。比如acbca是回文串,而abc不是(abc的順序為「abc」,逆序為「cba」,不相同)。

輸入長度為n的串s,求s的最長雙回文子串t,即可將t分為兩部分x,y,(|x|,|y|≥1)且x和y都是回文串。

對於$10%$的資料, $ 2≤|s|≤10^3 $。

對於$30%$的資料,$ 2≤|s|≤10^4 $。

對於$100%$的資料,$ 2≤|s|≤10^5 $。

solution

先manache求出每個位置為中心的最長回文串,把中心的位置打在左端點上。

從左到右取一邊max,求出每乙個位置x覆蓋它的最右位置p[x]。

接著訪問每乙個中心x,取他的右端點xr,則ans= max(ans,p[xr]-x);相當於拼起來

我的做法是非正解。。沒過的同學可以看看別人的。

我們oj資料弱可以過,洛谷過不了。

有沒有神犇看看為啥錯?或者出資料卡卡。

博主不勝感激。

1 #include2 #include3 #include4 #include5 #include6 #include7

#define maxn 1000000

8using

namespace

std;

9int

n,p[maxn],max[maxn];

10char

ch[maxn],s[maxn];

11int

main()

1217

int mr=0,id=0;s[0]='

%';s[1]='

%';s[n+n+2]='

\n';n=n+n+1;18

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

26 max[i-p[i]]=max(max[i-p[i]],id);

27//

cout<28}29

for(int i=1;i<=n;i++)max[i]=max(max[i],max[i-1

]);30

int ans=0;31

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

34 cout

35return0;

36 }

view code

posted @

2019-04-06 21:22

liankewei123456 閱讀(

...)

編輯收藏

最長雙回文串

題目大意 輸入長度為n的串s,求s的最長雙回文子串t,即可將t分為兩部分x,y,x y 1 且x和y都是回文串。題解 若x,y都是回文串且相鄰,則共用乙個 可以對於每個 找出其左邊界和右邊界。include include include using namespace std define n 1...

最長雙回文串

題目描述 順序和逆序讀起來完全一樣的串叫做回文串。比如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 都是回文串。輸入格式 一行由小寫英文本...