Hdu_3068 Manacger算法的心得
生活随笔
收集整理的這篇文章主要介紹了
Hdu_3068 Manacger算法的心得
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
關于manacher算法,似乎在學完KMP之后,比較容易上手,雖然有些原理方面,我沒有理解的太深。
Manacher就是解決回文串的問題,求一個字符串中的最長回文子串。
Manacher算法首先對字符串進行處理:在所有字符之間插入‘#’,這樣的好處是,無論最長回文子串是奇數個或者是偶數個,都可以進行處理。
處理過程是這樣的
假設原串是這樣的
1 2 3 4 5
a b b a d
處理完成一個新數組
0 1 2 3 4 5 6 7 8 9 10 11 12
? # a # b # b # a # d # 0
1 2 1 2 5 2 1 2 1 2 1
首尾設置完全不相干的字符,是為了檢測回文時,不會被算進去。
最下一列叫做P[i] ,用來記錄當前位的回文個數,如果前后都不回文,默認p[i]=1,(可以當成自身回文)。
算法核心部分有三部分
還是直接用代碼來講吧:
HD#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 1100050
char str[maxn];
char a[maxn<<];
int p[maxn<<];
int min(int x,int y)
{
if (x<y) return x;
return y;
}
int main()
{while (scanf("%s",&str[]))
{ if (str[]=='E') break;
int i,j;
a[]='?',a[]='#';
for (i=; str[i]; i++)//處理成新的字符串。
{
a[(i<<)]=str[i];
a[(i<<)+]='#';
}
int n=(i<<);
a[n]=;
int maxid=,maxl=,id=;
for (i=; i<n; i++)//代碼的核心部分。
{
if (maxid>i)//如果之前記錄的最大回文覆蓋超過了當前點坐標,進行比較(這一步其實我也不是很理解,只知道可以節省搜索,優化時間)
p[i]=min(p[*id-i],maxid-i); //進行覆蓋度的比較,取較小的為p[i]
else
p[i]=; //否則直接定義為默認值1。
while (a[i+p[i]]==a[i-p[i]]) p[i]++; //前后搜索,若回文,則+1;
ifmaxid)//獲取當前最大覆蓋面,和覆蓋點。
{
maxid=p[i]+i;
id=i;
}
if (p[i]>maxl) maxl=p[i]; //最大回文長度保存在p[i]中,取p[i]最大值即可。(此時最長回文串的中間點即為i點(不過是加了‘#’的新串))
}
printf("%d\n",maxl-);
}
return ;
}
總結
以上是生活随笔為你收集整理的Hdu_3068 Manacger算法的心得的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python中操作MySQL/Oracl
- 下一篇: Python SQLAlchemy入门教