思路:manacher求解字符串最长回文串
分析:详见点击打开链接
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define MAXN 240010 int ans; char tmpStr[MAXN]; char String[MAXN]; int rad[MAXN]; /*求rad数组*/ void manacher(){ ans = 0; int mx = 0; int id; int len = strlen(String); for(int i = 1 ; i < len ; i++){ if(mx > i) rad[i] = min(rad[2*id-i] , mx-i); else rad[i] = 1; for(; String[i+rad[i]] == String[i-rad[i]] ; rad[i]++); if(rad[i]+i > mx){ mx = rad[i]+i; id = i; } ans = max(ans , rad[i]); } } int main(){ while(scanf("%s" , tmpStr) != EOF){ /*求String*/ int pos = 0; int len = strlen(tmpStr); String[pos++] = '$'; for(int i = 0 ; i <= len ; i++){/*这里是枚举到len的长度*/ String[pos++] = '#'; String[pos++] = tmpStr[i]; } manacher(); printf("%d\n" , ans-1); } return 0; }