題目描述
順序和逆序讀起來完全一樣的串叫做回文串。比如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 #include7view code#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 }
最長雙回文串
題目描述 順序和逆序讀起來完全一樣的串叫做回文串。比如acbca是回文串,而abc不是 abc的順序為 abc 逆序為 cba 不相同 輸入長度為n的串s,求s的最長雙回文子串t,即可將t分為兩部分x,y,x y 1 且x和y都是回文串。對於 10 的資料,2 s 10 3 對於 30 的資料,2 ...
最長雙回文串
題目大意 輸入長度為n的串s,求s的最長雙回文子串t,即可將t分為兩部分x,y,x y 1 且x和y都是回文串。題解 若x,y都是回文串且相鄰,則共用乙個 可以對於每個 找出其左邊界和右邊界。include include include using namespace std define n 1...
最長雙回文串 manacehr
題目描述 順序和逆序讀起來完全一樣的串叫做回文串。比如 acbca 是回文串,而 abc 不是 abc 的順序為 abc 逆序為 cba 不相同 輸入長度為 n 的串 s,求 s 的最長雙回文子串 t,即可將 t 分為兩部分 x,y,x y 1 且 x 和 y 都是回文串。輸入格式 一行由小寫英文本...