HDU 3068 最長回文串

2021-08-07 16:13:07 字數 2195 閱讀 3480

用的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...