【XSY2534】【CF835D】Palindromic characteristics 回文自动机
题目大意
一个字符串\(s\)是\(1\)−回文串当且仅当这个串是回文串。
一个串\(s\)是\(k\)−回文串\((k>1)\)当且仅当\(s\)的前一半与后一半相同且\(s\)的前一半是非空\((k−1)\)−回文串。
一个串\(s\)的前一半是这个串的长度为\(\lfloor\frac{|s|}{2}\rfloor\)的前缀,一个串\(s\)的后一半是这个串的长度为\(\lfloor\frac{|s|}{2}\rfloor\)的后缀
有一个字符串\(s\),对于每个\(k\in\{1\ldots n\}\),求出\(s\)的多少个子串是\(k\)−回文串。
原题:\(1\leq n\leq 5000\)
加强版:\(1\leq n\leq 1000000\)
题解
我们可以发现,一个串是\(k\)-回文串,那么这个串就是\((k-1)\)-回文串\((k>1)\)
所以可以DP:设\(f_{i,j}\)表示\(s_{i\ldots j}\)最高是几阶回文串
时间复杂度:\(O(n^2)\)
我们还可以用BZOJ4044那道题的方法,在回文自动机上处理出每个串的长度不超过这个串长一半的最长回文后缀,然后直接转移即可
时间复杂度:\(O(n)\)
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
using namespace std;
typedef long long ll;
int nxt[1000010][30];
int fail[1000010];
int len[1000010];
int trans[1000010];
int a[1000010];
int f[1000010];
int cnt[1000010];
ll ans[1000010];
int p;
int n;
int last;
void init(int x)
{
int i;
for(i=1;i<=26;i++)
nxt[x][i]=2;
}
void add(int x)
{
a[++n]=x;
while(a[n-len[last]-1]!=a[n])
last=fail[last];
int cur=last;
if(nxt[cur][x]==2)
{
int now=++p;
init(p);
len[now]=len[cur]+2;
last=fail[last];
while(a[n-len[last]-1]!=a[n])
last=fail[last];
fail[now]=nxt[last][x];
if(len[fail[now]]<=len[now]/2)//没有这部分也可以AC
trans[now]=fail[now];
else
{
last=trans[cur];
while(len[last]+2>len[now]/2||a[n-len[last]-1]!=a[n])
last=fail[last];
trans[now]=nxt[last][x];
}
nxt[cur][x]=now;
}
last=nxt[cur][x];
cnt[last]++;
}
void solve()
{
f[1]=0;
f[2]=0;
int i;
for(i=3;i<=p;i++)
if(len[trans[i]]==len[i]/2)
f[i]=f[trans[i]]+1;
else
f[i]=1;
for(i=p;i>=3;i--)
cnt[fail[i]]+=cnt[i];
for(i=3;i<=p;i++)
ans[f[i]]+=cnt[i];
}
char s[1000010];
int main()
{
// freopen("necklace.in","r",stdin);
// freopen("necklace.out","w",stdout);
p=0;
n=0;
init(++p);
fail[p]=2;
len[p]=-1;
trans[p]=2;
init(++p);
fail[p]=1;
len[p]=0;
a[0]=-1;
trans[p]=1;
last=p;
int m;
scanf("%s",s+1);
m=strlen(s+1);
int i;
for(i=1;i<=m;i++)
add(s[i]-'a'+1);
solve();
for(i=m-1;i>=1;i--)
ans[i]+=ans[i+1];
for(i=1;i<=m;i++)
printf("%lld\n",ans[i]);
return 0;
}
【XSY2534】【CF835D】Palindromic characteristics 回文自动机的更多相关文章
- [加强版] Codeforces 835D Palindromic characteristics (回文自动机、DP)
题目链接: https://codeforces.com/contest/835/problem/D 题意: 一个回文串是\(1\)-回文的,如果一个回文串的左半部分和右半部分一样且都是\(k\)-回 ...
- Palindromic Tree 回文自动机-回文树 例题+讲解
回文树,也叫回文自动机,是2014年被西伯利亚民族发明的,其功能如下: 1.求前缀字符串中的本质不同的回文串种类 2.求每个本质不同回文串的个数 3.以下标i为结尾的回文串个数/种类 4.每个本质不同 ...
- 【知识总结】回文自动机(Palindrome_Automaton)
参考资料:Palindromic Tree--回文树[处理一类回文串问题的强力工具](请注意,其中似乎有一些错误) 回文自动机似乎和回文树是同一个东西qwq? 回文自动机(PAM)是一种处理回文串的工 ...
- URAL 2040 (回文自动机)
Problem Palindromes and Super Abilities 2 (URAL2040) 题目大意 给一个字符串,从左到右依次添加,询问每添加一个字符,新增加的回文串数量. 解题分析 ...
- URAL 2040 Palindromes and Super Abilities 2 (回文自动机)
Palindromes and Super Abilities 2 题目链接: http://acm.hust.edu.cn/vjudge/contest/126823#problem/E Descr ...
- 后缀自动机/回文自动机/AC自动机/序列自动机----各种自动机(自冻鸡) 题目泛做
题目1 BZOJ 3676 APIO2014 回文串 算法讨论: cnt表示回文自动机上每个结点回文串出现的次数.这是回文自动机的定义考查题. #include <cstdlib> #in ...
- [模板] 回文树/回文自动机 && BZOJ3676:[Apio2014]回文串
回文树/回文自动机 放链接: 回文树或者回文自动机,及相关例题 - F.W.Nietzsche - 博客园 状态数的线性证明 并没有看懂上面的证明,所以自己脑补了一个... 引理: 每一个回文串都是字 ...
- BZOJ2160拉拉队排练——回文自动机
题目描述 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了.拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛.所以作为拉拉队队长的楚雨荨同学知道,帮助篮球队训练好拉拉队有多 ...
- BZOJ2084[Poi2010]Antisymmetry——回文自动机
题目描述 对于一个01字符串,如果将这个字符串0和1取反后,再将整个串反过来和原串一样,就称作“反对称”字符串.比如00001111和010101就是反对称的,1001就不是.现在给出一个长度为N的0 ...
随机推荐
- 如何在C#中使用Dapper(译)
前言: 对象关系映射(ORM)已经被使用了很长时间,以解决在编程过程中对象模型与数据模型在关系数据库中不匹配的问题. Dapper是由Stack OverFlow团队开发的开源的,轻量级的ORM.相比 ...
- Minimal string CodeForces – 797C
题目链接 题目难度: 1700rating 题目类型:string+贪心+STL 题目思路: 由于题目要求的最终结果是字典序最小的那个字符串,那么我们从贪心的从’a’开始查找字符串里是否存在,如果存在 ...
- iOS --- Touch ID指纹解锁
https://www.cnblogs.com/ljmaque/p/TouchID.html 最近在项目中刚好用到了TouchId指纹解锁功能,之前也没有接触过,立马百度看看究竟是要如何使用,发现其实 ...
- Thrift序列化与反序列化
Thrift序列化与反序列化的实现机制分析 Thrift是如何实现序死化与反序列化的,在IDL文件中,更改IDL文件中的变量序号或者[使用默认序号的情况下,新增变量时,将新增的变量不放在IDL文件的结 ...
- CSS颜色代码 颜色值 颜色名字大全
颜色值 CSS 颜色使用组合了红绿蓝颜色值 (RGB) 的十六进制 (hex) 表示法进行定义.对光源进行设置的最低值可以是 0(十六进制 00).最高值是 255(十六进制 FF).从 0 到 25 ...
- Jmeter之发送请求入参必须使用编码格式、Jmeter之发送Delete请求可能入参需要使用编码格式
这里的其中一个属性值必须要先编码再传参才可以,具体可以通过抓包分析观察:
- asp.net core Api配置swagger
这个很简单的一篇文章用来记录以下使用swagger的过程,以后有用. 1.nuget 下载install-package Swashbuckle.AspNetCore 2.startup里面confi ...
- linux 安装ssh以及ssh用法与免密登录
想要免费登录就是把本地机器的id_rsa_pub的内容放到远程服务器的authorized_keys里面 一.配置yum和hosts文件 配置hosts文件: 命令:vi /etc/hosts 在文件 ...
- TextView不用ScrollViewe也可以滚动的方法
转自:http://www.jb51.net/article/43377.htm android TextView不用ScrollViewe也可以滚动的方法. TextView textview = ...
- DAY02、正式介绍python
一.编程语言介绍(***) 1.1.机器语言:直接用计算机能理解的二进制指令编写程序,直接控制硬件 1.2.汇编语言:用英文标签取代二进制指令编写程序,本质也是直接控制硬件 1.3.高级语言:用人类能 ...