给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
回文就是正反读都是一样的字符串,如aba, abba等
Input输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S
两组case之间由空行隔开(该空行不用处理)
字符串长度len <= 110000Output每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.
Sample Input
aaaa abab
Sample Output
4 3
#include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #include<cmath> using namespace std; #define ll long long int #define ull unsigned long long int #define e 2.718281828459 #define INF 0x7fffffff #pragma warning(disable:4996) #define pf printf #define sf scanf #define max(a,b) (a)>(b)?(a):(b); #define min(a,b) (a)<(b)?(a):(b); #define pi acos(-1.0); #define eps 1e-9; #include <cstdlib> using namespace std; char ar[110001]; char temp[220002]; int p[220002]; int manacher(int len) { int ans = 0; int j = 0; int id = 0; int mx = 0; for (int i = 1; i < len; i++) { if (i > mx) p[i] = 1; else p[i] =min( p[2 * id - i],mx-i); while (temp[i - p[i]] == temp[i + p[i]]) p[i]++; if (i + p[i] > mx) { mx = i + p[i]; id = i;; } if (ans < p[i]) ans = p[i]; } return ans; } void init(int len) { temp[0] = '@'; temp[1] = '#'; int j = 2; for (int i = 0; i < len; i++) { temp[j++] = ar[i]; temp[j++] = '#'; } temp[j] = '