【CF835D】Palindromic characteristics 加强版

Description

给你一个串,让你求出\(k\)阶回文子串有多少个。\(k\)从\(1\)到\(n\)。

\(k\)阶子串的定义是:子串本身是回文串,而且它的左半部分也是回文串。

首先明确:

  1. 如果一个串是\(k\)阶回文,那他一定还是\(k-1\)阶回文。

  2. 如果一个串是\(k\)阶回文,那么这个串需要满足:

  • 它本是是回文的。
  • 他的左半部分是\(k-1\)回文的。

Input

一个字符串\(s\)

Output

共\(n\)行。第\(i\)行输出\(s\)有多少个子串是\(i−\)回文串。

HINT

对于\(100\%\)的数据:\(1≤n≤5000000\)$仅包含小写字母


思路:建出\(PAM\)之后维护一个\(f_i\)代表长度小于一半的最长回文后缀,不要暴力去更新\(Ta\),也不用调跳倍增,直接借助父亲节点的这个数组缩小一半的范围就是\(O(n)\)的了。


Code:

#include <cstdio>
#include <cstring>
#define ll long long
const int N=5e3+10;
char s[N];
int ch[N][26],len[N],fail[N],kth[N],f[N],n,tot;
ll ans[N],siz[N];
int getfail(int now,int p)
{
while(s[p]!=s[p-len[now]-1]) now=fail[now];
return now;
}
void PAM()
{
len[0]=0,len[++tot]=-1,f[0]=fail[0]=1;
scanf("%s",s+1);n=strlen(s+1);
for(int las=0,i=1;i<=n;i++)
{
int cur=getfail(las,i),c=s[i]-'a';
if(!ch[cur][c])
{
int now=++tot;
fail[now]=ch[getfail(fail[cur],i)][c];
ch[cur][c]=now;
len[now]=len[cur]+2;
if(len[fail[now]]<=len[now]>>1) f[now]=fail[now];
else
{
int p=f[cur];
while((len[p]+2>len[now]>>1)||(s[i]!=s[i-len[p]-1])) p=fail[p];
f[now]=ch[p][c];
}
}
++siz[las=ch[cur][c]];
}
for(int i=tot;i;i--) siz[fail[i]]+=siz[i];
for(int i=2;i<=tot;i++)
{
if(len[f[i]]==len[i]>>1)
kth[i]=kth[f[i]]+1;
else
kth[i]=1;
ans[kth[i]]+=siz[i];
}
}
int main()
{
PAM();
for(int i=n;i;i--) ans[i]+=ans[i+1];
for(int i=1;i<=n;i++) printf("%lld\n",ans[i]);
return 0;
}

2018.12.14

【CF835D】Palindromic characteristics 加强版 解题报告的更多相关文章

  1. 【LeetCode】647. Palindromic Substrings 解题报告(Python)

    [LeetCode]647. Palindromic Substrings 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/p ...

  2. USACO Section1.2 Palindromic Squares 解题报告

    palsquare解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------ ...

  3. LeetCode 解题报告索引

    最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中......                        ...

  4. [置顶] 刘汝佳《训练指南》动态规划::Beginner (25题)解题报告汇总

    本文出自   http://blog.csdn.net/shuangde800 刘汝佳<算法竞赛入门经典-训练指南>的动态规划部分的习题Beginner  打开 这个专题一共有25题,刷完 ...

  5. D. Palindromic characteristics 解析(DP)

    Codeforce 835 D. Palindromic characteristics 解析(DP) 今天我們來看看CF835D 題目連結 題目 略,請看原題 前言 想不到這種狀態... @copy ...

  6. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  7. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  8. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

  9. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

随机推荐

  1. Redis源码阅读(六)集群-故障迁移(下)

    Redis源码阅读(六)集群-故障迁移(下) 最近私人的事情比较多,没有抽出时间来整理博客.书接上文,上一篇里总结了Redis故障迁移的几个关键点,以及Redis中故障检测的实现.本篇主要介绍集群检测 ...

  2. Hyperledger Fabric 1.0 从零开始(一)

    在HyperLedger/Fabric发布0.6的时候,公司就已经安排了一个团队研究这一块,后来也请IBM的专家组过来培训了一批人,不幸的是,这批人后来全走了,然后1.0就发布了.自从2017年7月H ...

  3. SparkRDD编程实战

    通过spark实现点击流日志分析案例 1. 访问的pv package cn.itcast import org.apache.spark.rdd.RDD import org.apache.spar ...

  4. basename命令详解

    基础命令学习目录首页 摘要:前言bashname命令用于获取路径中的文件名或路径名(获取的时候叶子节点的元素内容)常见用法举例basenamepath获取末尾的文件名或路径名1:[aliyunzixu ...

  5. fiddler常识汇总

    Fiddler 抓包工具总结   名称 含义 # 抓取HTTP Request的顺序,从1开始,以此递增 Result HTTP状态码 Protocol 请求使用的协议,如HTTP/HTTPS/FTP ...

  6. dobule运算

    DecimalFormat df = new DecimalFormat("0.00"); double rate = (warnMonNum/totalCustCount)*10 ...

  7. java实验1实验报告(20135232王玥)

    实验一 Java开发环境的熟悉 一.实验内容 1. 使用JDK编译.运行简单的Java程序 2.使用Eclipse 编辑.编译.运行.调试Java程序 二.实验要求 1.没有Linux基础的同学建议先 ...

  8. springmvc 映射重复

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springfr ...

  9. ubuntu16.04安装cuda8.0试错锦集

    ubuntu16.04安装cuda8.0试错锦集 参考文献: [http://www.jianshu.com/p/35c7fde85968] [http://blog.csdn.net/sinat_1 ...

  10. 第一个Sprint冲刺成果

    组长:李咏江,组员:叶煜稳,谢洪跃,周伟雄 进程:第一个算法功能完成