很簡單的例題,就比如hdu3068那個,模版題。
首先我們可以考慮暴力,然後可以列舉中心,當你列舉中心的時候,先是1,再是2,如果2不行,那就可以退出了,因為以該點為中心的字串不能繼續拓展了。我們應該開始列舉下乙個中心點了。
然後我們考慮優化,馬拉車演算法的核心就是利用了前面計算的資訊,從而高效的得出最長回文字串,考慮奇偶性的時候,我們插入『#』使得統一。
/**************************
*create time: fri jul 29 21:15:44 2016
*author: mymilkbottles
*file name: hihocoder1032
**************************/
#include
using
namespace
std;
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define pi(x,y) printf("%d%c",(x),(y));
#define pin(x) printf("%d\n",(x));
#define si(x) scanf("%d",&(x))
#define sii(x,y) scanf("%d%d",&(x),&(y))
#define s3(x,y,z) scanf("%d%d%d",&(x),&(y),&(z))
#define rep(x,y,z) for(int (x)=(y);(x)<(z);++(x))
#define dep(x,y,z) for(int (x)=(y)-1;(x)>=(z);--(x))
#define read int tcasen;scanf("%d",&tcasen);for(int tcase=1;tcase<=tcasen;++tcase)
#define cls(x,y) memset((x),(y),sizeof((x)));
#define pb(x) push_back(x)
#define mp(x,y) make_pair((x),(y))
#define max3(value_a,value_b,value_c) max(max(value_a,value_b),value_c)
#define min3(value_a,value_b,value_c) min(min(value_a,value_b),value_c)
#define gt(x) (x)=clock();
///in this you can define long integer type
#define longtype long long
typedef longtype ll;
typedef
unsigned longtype ull;
const
int maxint=((~((unsigned)(0)))>>1);
const ll maxll=((~((unsigned longtype)(0)))>>1);
const
int inf=0x3f3f3f3f;
const
double pi=acos(-1.0);
const
int maxn=1e6+1000+5;
char dp[maxn<<1];
char a[maxn];
int p[maxn<<1];
int len;
void mlc() else p[i]=1;
while(dp[i-p[i]]==dp[p[i]+i])++p[i];
// cout<<"i="mx)
ans=max(ans,p[i]-1);
}printf("%d\n",ans);
}int main()
dp[len++]='\0';
mlc();
}#ifdef tangge
gt(tend);
printf("%.8lf\n",(tend-tstart)/1000.0);
#endif // tangge
return
0;}
最長回文字串(馬拉車演算法)
演算法總結第三彈 manacher演算法,前面講了兩個字串相演算法 kmp和拓展kmp,這次來還是來總結乙個字串演算法,manacher演算法,我習慣叫他 馬拉車 演算法。相對於前面介紹的兩個 演算法,manacher 演算法的應用範圍要狹窄得多,但是它的思想和拓展kmp 演算法有很多共通支出,所以...
最長回文串(馬拉車演算法)
最長回文子串 manacher演算法 馬拉車演算法 馬拉車演算法需要計算以每個字元為中心的回文串半徑。並記錄最右邊界 馬拉車演算法基於這樣乙個事實,從回文串的中心到兩邊是對稱的,意味著以兩邊對稱的字元為中心的回文串半徑相等 在不超過最右邊界的情況下,如果超出就需要擴充套件搜尋 public stri...
最長回文串 馬拉車演算法
有兩個長度均為n的字串a和b。可以從a中選乙個可以為空的子串a l1 r1 b中選乙個可以為空的子串b l2 r2 滿足r1 l2,然後把它們拼起來 a l1 r1 b l2 r2 求用這樣的方法能得到的最長回文串的長度。注意 求的不是本質不同的回文串個數哦!解題報告 找兩個之間的最長回文串,只不過...