如果长度为n的字符串是一个回文串,同时它的长度为前缀和后缀是K-1度回文串,则这个字符串被称为K度回文串。根据定义,任何字符串(即使是空字符串)都是0度回文串。
对于一个K度回文串,字符串的回文度就是这个K的最大值,例如,“abaaba”的度为3。
你将得到一个字符串,你的任务是得到它所有前缀的回文度的和。
Input
输入数据的第一行是一个非空字符串,包含拉丁字母和数字。字符串的长度不超过5*10^6 。
Output
输出唯一的数字,即字符串的所有前缀的回文度的和。
Input示例
a2A
Output示例
1
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 1e7 + 10;
char A[MAXN];
int B[MAXN];
void Manacher(int len)
{
int mx = 0, id = 0;
for (int i = 1; i < len; i++)
{
if (i <= mx)
{
B[i] = min(B[2 * id - i] , mx - i + 1);
}
else
{
B[i] = 1;
}
while (A[i - B[i]] == A[i + B[i]])
{
B[i]++;
}
if (i + B[i] - 1 > mx)
{
id = i;
mx = i + B[i] - 1;
}
}
}
int main()
{
char ch;
int len = 0;
A[len++] = '$';
A[len++] = '#';
while ((ch = getchar()) != '\n' && ch != EOF)
{
A[len++] = ch;
A[len++] = '#';
}
A[len] = '\0';
Manacher(len);
int pos = 1;
len /= 2;
for (int i = 2; i <= len; i++)
{
A[pos++] = B[i] == i;
}
memset(B, 0, sizeof(B));
for (int i = 1; i < pos; i++)
{
if (A[i])
{
B[i] = B[i / 2] + 1;
}
}
int result = 0;
for (int i = 1; i < pos; i++)
{
result += B[i];
}
cout << result << endl;
return 0;
}