O(n)算法求最长回文串
#include <cstdio> #define N 210000+10 #include <cstring> #include <algorithm> inline min(int a, int b){ return a<b?a: b; } inline max(int a, int b){ return a<b?b: a; } using namespace std; char s[N*2+1]; int p[N*2+1] ; int len; void init() { len=strlen(s); for(int i=len; i>=0; i--) { s[i*2+2]=s[i]; s[i*2+1]='#'; } s[0]='$'; } int getRec() { int Max=-1; for(int i=2; i<2*len-1; i++) { Max=max(Max, p[i]-1); } return Max; } void solve() { init(); int id=0, mx=0; for(int i=2; i< 2*len+1; i++) { //对称的位置, 但是要判断以下是否超过了mx的位置, 因为mx和 mx的后边还没有判断到, 所以不能超越; if(mx >i) p[i]=min(p[2*id- i], mx-i); else p[i]=1; //判断一下是否对称 ; while(s[i- p[i]] == s[i+ p[i]]) p[i]++; if(i+ p[i] >= mx) { id = i; mx=i+ p[i]; } } printf("%d\n", getRec()); } int main() { while(scanf("%s", s) != EOF) { solve(); } return 0; }
浙公网安备 33010602011771号