就是一个一直求回文串的题,,,回文值就是递归定义的,如果它是回文串,就是它的那个子串的回文值+1,不是就是0。
然后我还自做聪明地写了一个快速幂,结果被卡了,一看当时的讲解,直接一个预处理数组就好,,,唉,,窝还是智障啊
具体不想写了,有时间再来补
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
#define maxn 2000005
#define p 999983
#define mod 1000000007
char str[maxn];
int idx[260];
int n;
int num[maxn];
long long hash1[maxn], hash2[maxn], powp[1000003];
long long sum = 0;
long long pow_fast(long long x, int a)
{
long long ans = 1, tmp = x;
for (int i = 0; i <= 20; ++i)
{
if ((a&(1 << i)) > 0)
{
ans = ans*tmp;
if (ans >= mod)
ans %= mod;
}
tmp = tmp*tmp;
if (tmp >= mod)
tmp %= mod;
}
return ans;
}
void init()
{
for (char i = 'a'; i <= 'z'; ++i)
idx[i] = i - 'a' + 1;
for (int i = 'A'; i <= 'Z'; ++i)
idx[i] = i - 'A' + 27;
for (int i = '0'; i <= '9'; ++i)
idx[i] = i - '0' + 53;
powp[0] = 1;
for (int i = 1; i < 1000003; ++i)
{
powp[i] = powp[i - 1] * p;
if (powp[i] >= mod)
powp[i] %= mod;
}
}
int main()
{
//freopen("input.txt", "r", stdin);
init();
scanf("%s", str + 1);
n = strlen(str + 1);
for (int i = 1; i <= n; ++i)
hash1[i] = (hash1[i - 1] * p + idx[str[i]]) % mod;
for (int i = n; i > 0; --i)
hash2[i] = (hash2[i + 1] * p + idx[str[i]]) % mod;
/*for (int i = 1; i <= n; ++i)
printf("%lld ", hash1[i]);
printf("\n");
for (int i = n; i > 0; --i)
printf("%lld ", hash2[i]);
printf("\n");*/
num[1] = 1;
sum = 1;
for (int i = 2; i <= n; ++i)
{
int mid = i / 2;
long long l = hash1[mid];
long long r = hash2[i - mid + 1] - hash2[i + 1] * powp[mid];
if (r < 0 || r >= mod)
r %= mod;
if (r < 0)
r += mod;
if (l == r)
num[i] = num[mid] + 1;
sum += (long long)num[i];
}
/*for (int i = 1; i <= n; ++i)
printf("%d ", num[i]);
printf("\n");*/
printf("%lld", sum);
//system("pause");
//while (1);
return 0;
}