Manacher【p1210】回文检测
題目描述--->P1210 回文檢測
分析:
看到回文顯然想到了manacher算法(線性求解回文串問題
如果不了解還是去敲一下板子,學(xué)習(xí)一下比較好.-->manacher
題目要求我們求出只包含字母的回文串的長度.
如果你會manacher,這很簡單.
只需要在輸入之后處理一下我們得到的串即可.
這題的難點在于,如何輸出原串
吐槽
本來以為求出我們的最長回文半徑的最中間的位置的字符,判斷其左右兩側(cè)遇到的第一個字符是否相等,如果相等我們就可以一直擴(kuò)展過去,直至無法匹配.
感覺這種被卡的概率還是很低的...
興沖沖地碼了100多行.然而還是被卡了,絕望地很.
解決
首先明確:
s數(shù)組為我們的原字符數(shù)組. str數(shù)組為我們只含有大寫(小寫)字母的字符數(shù)組 ss數(shù)組為我們用于跑manacher的字符數(shù)組因此考慮去記錄字符在原數(shù)組中的位置.
很容易將我們轉(zhuǎn)化后的數(shù)組記錄.
這樣記錄↓
處理我們得到的數(shù)組↓
for(RI i=0;i<len;i++){if(str[i]>='a' and str[i]<='z')str[i]-=32;}//在這里將小寫轉(zhuǎn)為大寫.//也可以將大寫轉(zhuǎn)為小寫//視個人愛好而定.此時我們已經(jīng)記錄了某一位置對應(yīng)的原串位置.
接下來就是我們的manacher操作了!
處理我們用于manacher的數(shù)組↓
for(RI i=0;i<len;i++)ss[2*i+1]=str[i];ll=2*len+1;//這里記得變換長度. //這里我并沒有進(jìn)行插入字符的操作 //是因為我們的字符數(shù)組默認(rèn)為空. //這樣的處理操作會使得中間空出一些位置.從而達(dá)到插入字符的效果.我們現(xiàn)在需要考慮的是如何對我們用于manacher操作的數(shù)組進(jìn)行標(biāo)記操作,即對應(yīng)原串位置.
因為我們用于manacher的數(shù)組ss[2*i+1]對應(yīng)str[i],
所以我們的數(shù)組poss[2*i+1]也會對應(yīng)pos[i].
所以我們的答案就很明顯了.
最左端位置就是le=i-(RL[i]-1)+1 最右端位置就是ri=i+(RL[i]-1)-1 其中RL[i]-1代表以i為對稱軸的回文子串長度所以我們枚舉poss[le]到poss[ri]輸出答案即可.
--------------------代碼--------------------
#include<bits/stdc++.h> #define IL inline #define RI register int char s[200008],str[200008],ss[400008]; int l,len,pos[200008],RL[200008],ll,ans,le,ri,poss[200008]; int main() {while(~(s[l]=getchar())){l++;}//輸入還是看了其他人的 emmmm,自己寫的一個炸了 emmmfor(RI i=0;i<l;i++){if((s[i]>='a' and s[i]<='z') or (s[i]>='A' and s[i]<='Z'))str[len]=s[i],pos[len]=i,len++;}for(RI i=0;i<len;i++){if(str[i]>='a' and str[i]<='z')str[i]-=32;}int MaxRight=0,center=0;RL[0]=1;for(RI i=0;i<len;i++)ss[2*i+1]=str[i],poss[2*i+1]=pos[i];//這里的對應(yīng)操作.ll=2*len+1;for(RI i=1;i<ll;i++){if(i<=MaxRight)RL[i]=std::min(RL[2*center-i],MaxRight-i);else RL[i]=1;while(i-RL[i]>=0 and i+RL[i]<ll and ss[i+RL[i]]==ss[i-RL[i]])RL[i]++;if(i+RL[i]-1>MaxRight)MaxRight=i+RL[i]-1,center=i;if(RL[i]-1>ans){ans=RL[i]-1;le=i-RL[i]+2;ri=i+RL[i]-2;}}printf("%d\n",ans);for(RI i=poss[le];i<=poss[ri];i++)std::cout<<s[i]; }轉(zhuǎn)載于:https://www.cnblogs.com/-guz/p/9612862.html
總結(jié)
以上是生活随笔為你收集整理的Manacher【p1210】回文检测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何正确的检测对象类型?
- 下一篇: 软件工程--第一周学习进度