复习了一下这个算法,
注意数组大小要开两倍大。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <algorithm> #include <iterator> #include <iostream> #include <cstring> #include <cstdlib> #include <iomanip> #include <bitset> #include <cctype> #include <cstdio> #include <string> #include <vector> #include <cmath> #include <queue> #include <list> #include <map> #include <set> using namespace std; //#pragma GCC optimize(3) //#pragma comment(linker, "/STACK:102400000,102400000") //c++ #define lson (l , mid , rt << 1) #define rson (mid + 1 , r , rt << 1 | 1) #define debug(x) cerr << #x << " = " << x << " "; #define pb push_back #define pq priority_queue typedef long long ll; typedef unsigned long long ull; typedef pair<ll ,ll > pll; typedef pair<int ,int > pii; typedef pair<int,pii> p3; //priority_queue<int> q;//这是一个大根堆q //priority_queue<int,vector<int>,greater<int> >q;//这是一个小根堆q #define fi first #define se second //#define endl ' ' #define OKC ios::sync_with_stdio(false);cin.tie(0) #define FT(A,B,C) for(int A=B;A <= C;++A) //用来压行 #define REP(i , j , k) for(int i = j ; i < k ; ++i) //priority_queue<int ,vector<int>, greater<int> >que; const ll mos = 0x7FFFFFFFLL; //2147483647 const ll nmos = 0x80000000LL; //-2147483648 const int inf = 0x3f3f3f3f; const ll inff = 0x3f3f3f3f3f3f3f3fLL; //18 const int mod = 998244353; const double PI=acos(-1.0); // #define _DEBUG; //*// #ifdef _DEBUG freopen("input", "r", stdin); // freopen("output.txt", "w", stdout); #endif /*-----------------------showtime----------------------*/ int p[300009]; char str[300009],t[300009]; int Manacher(char *str,int len){ t[0] = '$';t[1] = '#'; int tot = 2; for(int i=0; i<len; i++){ t[tot++]=str[i]; t[tot++]='#'; } int mx = 0,id = 0,reslen = 0,resCenter = 0; for(int i=0; i<tot; i++){ if(i<mx) p[i] = min(p[2*id - i] , mx - i); else p[i] = 1; while(t[i+p[i]] == t[i-p[i]])p[i] ++; if(p[i]+i > mx){ mx = i + p[i]; id = i; } if(reslen < p[i]){reslen = p[i], resCenter = i;} } return reslen; } int main(){ while(~scanf("%s", str)){ int len = strlen(str); printf("%d ",Manacher(str,len)-1); } return 0; }