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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于manacher

發布時間:2025/6/17 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于manacher 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

由一個題引入:

求一個串A的最長回文串:
  A=abababa
最長回文串長度:5(ababa)

先思考用hash怎么做?

一、暴力
  枚舉左端,右端點(確定一個區間),線性掃一遍當前區間。
  Ans=max(ans);

  時間復雜度:O(n^3)
  貌似也有O(n^2)的暴力,在此不再贅述。
二、哈希
  分設兩個hash數組, ha1記錄前綴, ha2記錄后綴。
  對于任意[l,r] 若ha1[l,mid]==ha2[mid+1,r],則為回文串
  Ans=max(ans);

  時間復雜度:O(nlog 2 n)
三、manacher
  而manacher算法也可以在O(n)的時間內求出答案

定義數組 p[i]表示以i為中心的(包含i個這個字符)回文串半長。

將字符串s從前掃到后,來計算p[i],則最大的p[i]就是最長回文串長度。

算法流程:
由于s是從前掃描到最后的,所以需要計算p[i]時一定計算好了p[1]~~p[i-1]
假設現在掃描到了i+k這個位置,現在需要計算p[i+k]
定義maxlen是位置i+k位置前所有回文串中能延伸到的最有右端的位置,即maxlen=p[i]+i;
p[i]表示半徑長,i 表示目前最長的位置。

有兩種情況:

代碼:

#include<cstdio> #include<cstring> #include<iostream> #define m(s) memset(s,0,sizeof s); using namespace std; const int N=1e6+5; int l,cas,len,p[N<<1]; char s[N],S[N<<1]; void manacher(){int ans=0,id=0,mx=-1;for(int i=1;i<l;i++){if(id+mx>i) p[i]=min(p[id*2-i],id+mx-i);while(i-p[i]-1>=0&&i+p[i]+1<=l&&S[i-p[i]-1]==S[i+p[i]+1]) p[i]++;if(id+mx<i+p[i]) id=i,mx=p[i];ans=max(ans,p[i]);}printf("Case %d: %d\n",++cas,ans); } int main(){while(scanf("%s",s)==1){if(s[0]=='E') break;len=strlen(s);m(p);m(S);l=-1;for(int i=0;i<len;i++) S[++l]='#',S[++l]=s[i];S[++l]='#';manacher();}return 0; }

關于manacher的應用:

應用1.輸入一個字符串Str,輸出Str里最長回文子串的長度。 模板的用法

應用2.判斷是否能將字符串S分成三段非空回文串。

【輸入說明】
第一行一個整數T,表示數據組數。
對于每一個組,僅包含一個由小寫字母組成的串。
【輸出說明】
對于每一組,單行輸出"Yes" 或 "No“

解:

?對原串前綴和后綴作一個01標記pre[i],suf[i]表示1-i和i-n能否能形成回文。記以i為中心的回文半徑為r(i)。
?這些都可以在O(N)時間內求出。也可以使用Hash+二分等方法O(NlogN)內求出。
?我們考慮中間一個回文串的位置,不妨設它是奇數長度(偶數類似)。
?那么問題變成了求一個i和d使得1<=d<=r(i)且pre[i-d]和suf[i+d]為真。
?枚舉i,實際上就是問pre[i-r(i)..i-1]和suf[i+1..i+r(i)]取反后這兩段有沒有一個位置兩者均為1,也就是and后不為0,暴力壓位即可。
推薦:HDU 5340

一世安寧

轉載于:https://www.cnblogs.com/GTBA/p/9451293.html

總結

以上是生活随笔為你收集整理的关于manacher的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。