POJ3974 最長回文字串

2022-05-20 14:37:43 字數 997 閱讀 6169

在這裡採用的是雜湊+二分的方法。

根據回文串的性質可知,可以將回文分成奇回文和偶回文分別進行處理。

對於奇回文來說,每次列舉的端點一定是重合的,因此只需計算出端點左右公共的長度是多少即可,因此二分的是以該列舉點為中心的左半邊共有多少個字元。

對於偶回文來說,每次列舉的端點不一定是相等的,因此在二分的是以當前列舉點開始(包括當前列舉點)向右最多有多少個字元。

另外,之所以能夠採用二分是因為當前需判斷的左右串是否是回文這個問題具有單調性,即:從最大點處開始之後均不是回文,小於最大值均是回文。

在比較左右是否相等時,用字串雜湊在常數時間內比較即可。

**如下:

#include #include #include #include using namespace std;

const int maxn=1e6+10;

const int b=131;

char s[maxn];

int n,kase;

unsigned long long p[maxn],h1[maxn],h2[maxn];

#define cls(a,b) memset(a,b,sizeof(a))

void init()

void read_and_parse()

for(int i=n;i>=1;i--)h2[i]=h2[i+1]*b+s[i]-'a';

}unsigned long long get1(int l,int r)

unsigned long long get2(int l,int r)

void solve()

ans=max(ans,l<<1|1);

} for(int i=1;i<=n;i++)

ans=max(ans,r<<1);

} printf("case %d: %d\n",++kase,ans);

}int main()

return 0;

}

最長回文字串 POJ3974

曾經有乙個好演算法放到我面前,我沒有好好珍惜,直到用到的時候才後悔莫及。那就是manacher 馬拉車演算法 以o n 的複雜度計算最長回文字串。曾經刷leetcode的時候,室友跟我說了這個演算法,但當時那個題目用中間列舉也過了,我就沒有在意,直到前天才弄會,寫這篇報告之前,我又專門寫了一遍馬拉車...

字尾陣列求最長回文子串 POJ 3974

mle了.囧,不過演算法是正確的 define maxn 2000010 int wa maxn wb maxn wv maxn wss maxn int r maxn sa maxn int cmp int r,int a,int b,int l void da int r,int sa,int ...

最長回文字串

scanf s 輸入字串碰到空格或者tab就會停下來。此處可以使用fgets或者gets 另外注意標頭檔案cctype中的函式的巧妙使用,此處使用isalpha和toupper簡化了 此處列舉字串的中間位置,然後向倆邊擴充套件,節省了時間複雜度,注意向倆邊擴充套件時,奇數個和偶數個長度的區別。另外程...