pat L2 008 最長對稱子串

2021-07-11 20:23:05 字數 1820 閱讀 4885

時間限制

100 ms

記憶體限制

65536 kb

**長度限制

8000 b

判題程式

standard

作者

陳越

對給定的字串,本題要求你輸出最長對稱子串的長度。例如,給定"is pat&tap symmetric?",最長對稱子串為"s pat&tap s",於是你應該輸出11。

輸入格式:

輸入在一行中給出長度不超過1000的非空字串。

輸出格式:

在一行中輸出最長對稱子串的長度。

輸入樣例:

is pat&tap symmetric?
輸出樣例:
11
這道題在訓練賽中做過看了別人的**,結果到了比賽中還是不會寫,只有靠自己想出來的思維才能留在記憶的深處,靠理解記憶雖然可以進步很快

但是不是自己想出來的思維不通過反覆訓練的話並不會在腦海中保留太長時間。。。。

#include

#include

#include

#include

#include

using namespace std;

#define n 100000

int p[n];

char str[n];

int main()

str[0]='*';

int id=0, maxt=0;

for(int i=2;i<2*len+1;i++)

else

while(str[i-p[i]]==str[i+p[i]])

if(i+p[i]>id+p[id])

if(p[i]>=maxt)

}cout<

下面借鑑了大神的思維方式用dp的最優解解決,方法真的很巧妙

manacher演算法:

定義陣列p[i]表示以i為中心的(包含i這個字元)回文串半徑長

將字串s從前掃到後for(int i=0;i由於s是從前掃到後的,所以需要計算p[i]時一定已經計算好了p[1]....p[i-1]

假設現在掃瞄到了i+k這個位置,現在需要計算p[i+k]

定義maxlen是i+k位置前所有回文串中能延伸到的最右端的位置,即maxlen=p[i]+i;//p[i]+i表示最大的

分兩種情況:

1.i+k這個位置不在前面的任何回文串中,即i+k>maxlen,則初始化p[i+k]=1;//本身是回文串

然後p[i+k]左右延伸,即while(s[i+k+p[i+k]] == s[i+k-p[i+k]])++p[i+k]

2.i+k這個位置被前面以位置i為中心的回文串包含,即maxlen>i+k

這樣的話p[i+k]就不是從1開始

由於回文串的性質,可知i+k這個位置關於i與i-k對稱,

所以p[i+k]分為以下3種情況得出

//黑色是i的回文串範圍,藍色是i-k的回文串範圍,

PATL2 008 最長對稱子串(dp)

時間限制 100 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 對給定的字串,本題要求你輸出最長對稱子串的長度。例如,給定 is pat tap symmetric?最長對稱子串為 s pat tap s 於是你應該輸出11。輸入格式 輸入在一行...

L2 008 最長對稱子串

時間限制 100 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 對給定的字串,本題要求你輸出最長對稱子串的長度。例如,給定 is pat tap symmetric?最長對稱子串為 s pat tap s 於是你應該輸出11。輸入格式 輸入在一行...

L2 008 最長對稱子串

對給定的字串,本題要求你輸出最長對稱子串的長度。例如,給定 is pat tap symmetric?最長對稱子串為 s pat tap s 於是你應該輸出11。對給定的字串,本題要求你輸出最長對稱子串的長度。例如,給定 is pat tap symmetric?最長對稱子串為 s pat tap ...