用的manacher法,o(n)複雜度,證明跟kmp演算法一樣說不清**基本上是參考部落格鏈結
dp法記憶體不夠,中心擴充套件法時間不夠
//manacher法
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
#define debug
const
int maxn=110000*2+5,maxv=26,inf=0x3f3f3f3f,mod=100000000;
char str[maxn],s[maxn];
int rad[maxn];
int main()
s[2*len]='#';s[2*len+1]='\0';
int n=strlen(s);
for(int i=1,j=0,k;iwhile(s[i-j-1]==s[i+j+1]&&i+j+1
for(k=1;k<=j&&rad[i-k]+k!=rad[i];k++)
j=max(j-k,0);
}for(int i=0;i// printf("%d ", rad[i]);
ans=max(ans,rad[i]);
}printf("%d\n",ans);
}#ifdef debug
fclose(stdin);
fclose(stdout);
#endif
return
0;}
//中心擴充套件法
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
#define debug
const
int maxn=110000+5,maxv=26,inf=0x3f3f3f3f,mod=100000000;
char str[maxn];
int main()}}
for(int i=0;i1;i++)
j--;k++;}}
printf("%d\n",ans);
}#ifdef debug
fclose(stdin);
fclose(stdout);
#endif
return
0;}
//dp法,記憶體開不了那麼大
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
#define debug
const
int maxn=110000+5,maxv=26,inf=0x3f3f3f3f,mod=100000000;
int dp[maxn][maxn];
char str[maxn];
int main()
for(int i=3;i<=n;i++)
}printf("%d\n",ans);
}#ifdef debug
fclose(stdin);
fclose(stdout);
#endif
return
0;}
HDU 3068 最長回文串
解法1 根據是奇數串還是偶數串,遍歷中點,更新最長max值 複雜度o n 2 解法2 manacher 馬拉車演算法 o n 馬拉車演算法 1.中間插入 符號,統一變為奇數串規避奇偶問題 2.使用乙個輔助p陣列,p i 表示以 i 為中心的最長回文的半徑,p i 1正好是原字串中最長回文串的長度 3...
最長回文串 hdu3068
給出乙個只由小寫英文本元a,b,c.y,z組成的字串s,求s中最長回文串的長度.回文就是正反讀都是一樣的字串,如aba,abba等 input 輸入有多組case,不超過120組,每組輸入為一行小寫英文本元a,b,c.y,z組成的字串s 兩組case之間由空行隔開 該空行不用處理 字串長度len 1...
HDU 3068 最長回文
題 目 鏈 接 看完後自己寫了一遍,感覺真的是很神奇的結論啊!本來這題看到可以用字尾陣列來寫的,但沒有學過,去看了一下,真心給暈了,決定找個機會認真研究下。我的 include include includeusing namespace std define min a,b a b a b cha...