PIPI的字符串问题Ⅷ

题目描述

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);
}
发布了78 篇原创文章 · 获赞 7 · 访问量 4546

猜你喜欢

转载自blog.csdn.net/weixin_44433678/article/details/105184784
今日推荐