题目描述
PIPI研究了多年字符串后发现回文串是字符串中最优雅的一种存在了。所以PIPI发明了一种指标叫优雅度的指标来衡量一个字符串的优雅程度。优雅度定义如下:
1.空串和非回文串的优雅度为0。
2.一个长度为len的回文串的优雅度为,其长度为len/2(向下取整)的前缀和后缀的优雅度+1.
例如串"baabbaab"的优雅度为2,“babbab”的优雅度为3.
现在PIPI有一个长度为n的字符串,请你求出这个字符串的每一个前缀的优雅度的总和。
输入
第一行为一个整数n,表示串长。(n<=1e6)
第二行给出一个字符串,仅包含大写、小写字母以及数字。
输出
输出一个数字,表示答案。
样例输入
4
ACWA
样例输出
1
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
typedef unsigned long long ull;
ull base=23333;
ull hs[N],pw[N],hs_[N]; ///hs表示原始字符串的哈希值,hs_表示逆序字符串的哈希值
char s[N];
int dp[N]; ///记录从第一次字符到第i个字符的优雅度
ull get(int l,int r){ ///求逆序字符串任意区间的哈希值
return hs_[r]-hs_[l-1]*pw[r-l+1];
}
int main(){
int n;
scanf("%d",&n);
scanf("%s",s+1);
pw[0]=1;
for(int i=1;i<=n;i++){ ///初始化
hs[i]=hs[i-1]*base+s[i]-'0';
hs_[i]=hs_[i-1]*base+s[n-i+1]-'0';
pw[i]=pw[i-1]*base;
}
dp[1]=1;
int ans=1; ///记录优雅度的前缀和
for(int i=2;i<=n;i++){
if(hs[i]==get(n-i+1,n)){
dp[i]=dp[i/2]+1;
}
ans+=dp[i];
}
printf("%d",ans);
}