【CF835D】Palindromic characteristics 加强版 解题报告
【CF835D】Palindromic characteristics 加强版
Description
给你一个串,让你求出\(k\)阶回文子串有多少个。\(k\)从\(1\)到\(n\)。
\(k\)阶子串的定义是:子串本身是回文串,而且它的左半部分也是回文串。
首先明确:
如果一个串是\(k\)阶回文,那他一定还是\(k-1\)阶回文。
如果一个串是\(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 加强版 解题报告的更多相关文章
- 【LeetCode】647. Palindromic Substrings 解题报告(Python)
[LeetCode]647. Palindromic Substrings 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/p ...
- USACO Section1.2 Palindromic Squares 解题报告
palsquare解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------ ...
- LeetCode 解题报告索引
最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中...... ...
- [置顶] 刘汝佳《训练指南》动态规划::Beginner (25题)解题报告汇总
本文出自 http://blog.csdn.net/shuangde800 刘汝佳<算法竞赛入门经典-训练指南>的动态规划部分的习题Beginner 打开 这个专题一共有25题,刷完 ...
- D. Palindromic characteristics 解析(DP)
Codeforce 835 D. Palindromic characteristics 解析(DP) 今天我們來看看CF835D 題目連結 題目 略,請看原題 前言 想不到這種狀態... @copy ...
- CH Round #56 - 国庆节欢乐赛解题报告
最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...
- 二模13day1解题报告
二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...
- BZOJ 1051 最受欢迎的牛 解题报告
题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4438 Solved: 2353[S ...
- 习题:codevs 2822 爱在心中 解题报告
这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...
随机推荐
- 经典的性能优化最佳实践 web性能权威指南 读书笔记
web性能权威指南 page 203 经典的性能优化最佳实践 无论什么网络,也不管所用网络协议是什么版本,所有应用都应该致力于消除或减 少不必要的网络延迟,将需要传输的数据压缩至最少.这两条标准是经典 ...
- JavaWeb-Servlet-Tomcat
Servlet就是运行在服务器上的Java类.Servlet容器为javaweb应用提供运行时环境,负责管理Servlet和JSP的生命周期,以及管理它们的共享数据. Servlet容器软件——Tom ...
- dp算法之有代价的最短路径
题目:有代价的最短路径 题目介绍:如下图所示,现在平面上有N个点,此时N=7,每个点可能和其他点相连,相连的线有一定权值,求出从0点到N-1点的消耗权值的最小值. 分析:用动态规划的思路来解决,每一点 ...
- teamwork 2
1.访问上学期项目团队,学习他们的得失. 上学期学长们有一个项目是学霸系统,在看过了学长们的相关博客后,我们可以感受到学长们确实花费了不少心思,也看到了许多值得我们学习的地方. 首先,学长们在项目开始 ...
- 团队博客作业Week1 --- 团队成员简介
团队博客作业Week1 团队作业1 我们团队是一个以功能团队模式组建而成的团队,我们总共有5位队员,分别是:李剑锋.陈谋.卢惠明.潘成鼎.仉伯龙. 中间的那位就是李剑锋,我们的PM(项目经理).性格热 ...
- 四则运算截图and代码
1.运行截图 2.代码 #include<stdio.h> #include<stdlib.h> int main() { int i=300; int a=0; while( ...
- mongo导入导出命令
1.导出工具:mongoexport 1.概念: mongoDB中的mongoexport工具可以把一个collection导出成JSON格式或CSV格式的文件.可以通过参数指 ...
- 22_IO_第22天(File、递归)_讲义
今日内容介绍 1.File 2.递归 xmind:下载地址: 链接:https://pan.baidu.com/s/1Eaj9yP5i0x4PiJsZA4StQg 密码:845a 01IO技术概述 * ...
- JavaBean 与 EJB 的区别
JavaBean在一般情况下指的是实体类,在大部分情况下和POJO是同义词,基本构成就是一些字段和与之对应的 setter.getter方法,如果一个JavaBean需要在不同的JVM的进程中进行传递 ...
- grunt入门讲解3:实例讲解使用 Gruntfile 配置任务
这个Gruntfile 实例使用到了5个 Grunt 插件: grunt-contrib-uglify grunt-contrib-qunitgrunt-contrib-concatgrun ...