PAT L2-008. 最長對稱子串(25) (暴力,Manacher演算法和DP解決)
阿新 • • 發佈:2019-02-03
L2-008. 最長對稱子串
時間限制 100 ms記憶體限制 65536 kB
程式碼長度限制 8000 B
判題程式 Standard 作者 陳越
對給定的字串,本題要求你輸出最長對稱子串的長度。例如,給定"Is PAT&TAP symmetric?",最長對稱子串為"s PAT&TAP s",於是你應該輸出11。
輸入格式:
輸入在一行中給出長度不超過1000的非空字串。
輸出格式:
在一行中輸出最長對稱子串的長度。
輸入樣例:Is PAT&TAP symmetric?輸出樣例:
11原題連結:https://www.patest.cn/contests/gplt/L2-008
1000的長度,100ms,o(N^2)的複雜度是可以過的,那就暴力列舉吧,
每次列舉起點和終點沒如果此子串是迴文串,那終點-起點+1即為迴文串的長度,即可求出最大長度.
中間有個小問題,看程式碼註釋.
AC程式碼:
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int maxn=1000+5; char a[maxn]; int getMax(int x,int y) { //注:下面結束條件,必須為i<=j!!!; //當此字串長度為偶數是會有問題 //0 1 2 3 4 //5 4 3 2 1 for(int i=x,j=y; i<=j; i++,j--) { if(a[i]!=a[j]) return 0; } return y-x+1; } int main() { while(gets(a)) { int len=strlen(a); int maxx=0; for(int i=0; i<len; i++) { for(int j=i; j<len; j++) { maxx=max(maxx,getMax(i,j)); } } cout<<maxx<<endl; } return 0; }
網上還有高手用了o(N)的時間複雜度解決此問題: