日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

P3805 【模板】manacher算法

發(fā)布時(shí)間:2023/12/31 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P3805 【模板】manacher算法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

思路

manache的板子
manacher是一種能在O(n)的時(shí)間復(fù)雜度內(nèi)求出最長(zhǎng)回文子串的一種算法
首先要在每個(gè)串之間加上'#',使得奇數(shù)長(zhǎng)度和回文串和偶數(shù)長(zhǎng)度的回文串可以被統(tǒng)一考慮
之后要在首位加上'%',便于對(duì)出現(xiàn)位置進(jìn)行討論
比如axa變?yōu)?#a#x#a#'\0'
算法過(guò)程和p[i](表示以i為中心的最長(zhǎng)回文子串的半徑)相關(guān)
畫圖發(fā)現(xiàn),i為中心的最長(zhǎng)回文子串的長(zhǎng)度是p[i]-1,開始位置是(i-p[i])/2
然后manacher算法的核心就是這句

p[i]=(mx>i)?min(p[2*id-i],mx-i):1

mx是回文串右端點(diǎn)能延伸到的最遠(yuǎn)的位置,id是右端點(diǎn)能延伸到的最長(zhǎng)回文串的中間位置,
如果mx-i>p[2*id-i],證明相對(duì)于id和i對(duì)稱的回文串被id完全包括,由id的對(duì)稱性可知p[i]=p[2*id-i]
如果mx-i<p[2*id-i],證明沒有被完全包括,最長(zhǎng)的回文最少是mx-i,然后由后面的while循環(huán)繼續(xù)匹配
如果mx<=i,則無(wú)法做出任何假設(shè),只能讓p[i]=1然后由后面的while暴力匹配

#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 11000100; char s[MAXN]; int n,p[MAXN*2]; int manacher(char *s){char t[MAXN*2];int cnt=0,ans=0,id=0,mx=0;t[cnt++]='$';t[cnt++]='#';for(int i=1;i<=n;i++){t[cnt++]=s[i];t[cnt++]='#';}for(int i=0;i<=cnt;i++){p[i]=(mx>i)?min(p[2*id-i],mx-i):1;while(t[i-p[i]]==t[i+p[i]])p[i]++;if(i+p[i]>mx){mx=i+p[i];id=i;}if(p[i]-1>ans)ans=p[i]-1;}return ans; } int main(){scanf("%s",s+1);n=strlen(s+1);printf("%d\n",manacher(s));return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/dreagonm/p/10510871.html

總結(jié)

以上是生活随笔為你收集整理的P3805 【模板】manacher算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。