最長對稱子串(KMP)
阿新 • • 發佈:2019-02-06
對給定的字串,本題要求你輸出最長對稱子串的長度。例如,給定"Is PAT&TAP symmetric?",最長對稱子串為"s PAT&TAP s",於是你應該輸出11。
輸入格式:
輸入在一行中給出長度不超過1000的非空字串。
輸出格式:
在一行中輸出最長對稱子串的長度。
輸入樣例:
Is PAT&TAP symmetric?
輸出樣例:
11
輸入格式:
輸入在一行中給出長度不超過1000的非空字串。
輸出格式:
在一行中輸出最長對稱子串的長度。
輸入樣例:
Is PAT&TAP symmetric?
輸出樣例:
11
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; #define N 225000 ///dp[i] 表示以i點為中心向右最大回文長度 ///則答案就是max(dp[i]) -1 int dp[N]; char P[N], T[N]; ///在每一個字元間插入# 這樣得到的迴文串長度一定是奇數(包含#) int Have_P() { int j, len = strlen(T); j = 0; P[j++] = '$'; P[j++] = '#'; for(int i = 0; i < len; i++) P[j++] = T[i], P[j++] = '#'; P[j] = '\0'; return j; } void KMP(int Plen) { int mx = 0, id = 0; dp[0] = 0; for(int i = 1; i < Plen; i++) { dp[i] = mx>i? min(dp[2*id-i], mx-i) : 1; while(P[i + dp[i]] == P[i - dp[i]])dp[i]++; if(i + dp[i] > mx) { mx = dp[i] + i; id = i; } } } int main() { while(gets(T)) { int len, ans = 0; KMP(len = Have_P()); for(int i = 0; i < len; i++) ans = max(ans,dp[i]-1); printf("%d\n",ans); } return 0; }