【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分类强联 ...
随机推荐
- 三种UIScrollView嵌套实现方案
背景 随着产品功能不断的迭代,总会有需求希望在保证不影响其他区域功能的前提下,在某一区域实现根据选择器切换不同的内容显示. 苹果并不推荐嵌套滚动视图,如果直接添加的话,就会出现下图这种情况,手势的冲突 ...
- Linux——CentOS7添加/删除用户和用户组(学习笔记)
1.新建用户 adduser testuser //新建testuser 用户 passwd testuser //给testuser 用户设置密码 2.建工作组 groupadd testgroup ...
- 学习笔记 | Set
目录 Set Set 前言 不会数据结构选手 当几乎没写过什么数据结构的菜鸡遇上了毒瘤的splay和treap 时间正一点一点地被续走TAT 听说set有时候可以替代treap和splay 那么菜鸡L ...
- Redux 入门教程(一):基本用法
转自http://www.ruanyifeng.com/blog/2016/09/redux_tutorial_part_one_basic_usages.html(仅供个人学习使用) 首先明确一点, ...
- 快速删除docker中的容器
http://blog.csdn.net/cmzsteven/article/details/49230363
- maven实战读书笔记(二)
一个Spring加载属性的工具类,指定目标位置之后可以用${}的方式加载配置文件 测试maven工程发送email的例子:运行成功的例子—github 常用的命令: mvn clean compile ...
- (第十一周)约跑APP测试报告
项目名称:约跑App 用户需求规格说明书URL:http://www.cnblogs.com/liquan/p/6071804.html 组长博客URL:http://www.cnblogs.com/ ...
- 《构建之法》第四&十七章读书笔记
<构建之法>第四&十七章读书笔记 一. 前言 再次阅读<构建之法>,愈发被其中生动有趣的举例吸引.作为一本给予软件工程学生的书籍,其不以枯燥的理论知识 ...
- spring时间管理
spring时间管理相比Quartz要简单的多,但功能不如quartz强大 spring.xml的配置 <?xml version="1.0" encoding=" ...
- jmeter body 中文显示为乱码解决
这种情况在jmeter3.0的版本中才会产生,注意:这不是乱码,而是由于3.0中优化body data后,使用默认的字体(Consolas)不支持汉字的显示.这样的情况可以这样调整:进入jmeter. ...