Mancher求最大回文子串 Hdu 3068
2016-08-11 14:39
393 查看
Manacher
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<string> #define rep(i,a,b) for(int i=a; i<=b; ++i) #define per(i,a,b) for(int i=a; i>=b; --i) #define write(A) printf("%d\n",A); #define M 200001 using namespace std; string s,str; int Max,Maxi; int Len_s,Len_str; void manacher() { int *p=new int[Len_str+10]; Max=0; Maxi=0; memset(p,0,sizeof(p)); int mx=0,id=0; rep(i,1,Len_str) { if(mx>i) p[i]= p[2*id-i]<mx-i?p[2*id-i]:mx-i; else p[i]=1; //利用小串对称点与大串关系更新 while(str[i-p[i]]==str[i+p[i]]) ++p[i]; if(i+p[i]>mx) mx=i+p[i],id=i; } rep(i,1,Len_str) if(p[i]>Max) Max=p[i], Maxi=i; --Max;//显然当前字符不能算两次 write(Max); delete p;//删去动态的p,节省空间 return; } int main() { while(cin>>s) { Len_s=s.length(); str="$#";//这是马拉车的初始化,因为方便p的计算,于是加上奇怪字符,用string类型 rep(i,0,Len_s-1)str+=s[i],str+="#";//显然char类型没有强大的功能 Len_str = str.length(); manacher(); } }
相关文章推荐
- 最大算法【Manacher模板】HDU 3068——求最长回文子串
- hdu 3068 最长回文 Manacher求最大回文串
- 【最长回文子串——Manacher算法】POJ 3974/HDU 3068
- HDU 3068 最长回文 【最长回文子串】
- 【最长回文子串 manacher】HDU 3068
- hdu 3068 最长回文 【Manacher求最长回文子串,模板题】
- hdu 3068 最长回文(manachar求最长回文子串)
- HDU 3068 最长回文子串 (manacher算法详解)
- hdu 3068 最长回文子串(马拉车算法)
- hdu 4513 3068 Manacher算法--O(n)回文子串算法
- HDU 3068 最长回文(求最长回文子串)
- hdu【最长回文子串——Manacher算法】POJ 3974/HDU 3068
- hdu 3068 Manacher算法 O(n)回文子串算法
- 最长回文子串(百度笔试题和hdu 3068)
- hdu 3068 最长回文子串(Manacher算法模板题)
- HDU 3068 最长回文 (求最长回文子串)
- hdu 3068 最长回文子串 Manacher算法
- 最长回文子串(百度笔试题和hdu 3068)
- HDU 3068 最长回文子串O(n)算法
- HDU 3068 最长回文(求最长回文子串)