正题

题目链接:https://www.luogu.com.cn/problem/CF932G


题目大意

给出一个长度为\(n\)的字符串,将其分为\(k\)段(\(k\)为任意偶数),记为\(p\)。要求满足对于任意\(i\)都有\(p_i=p_{k-i+1}\)。求方案数。

\(1\leq n\leq 10^6\)


解题思路

考虑将字符串化为\(S_1S_nS_2S_{n-1}S_3S_{n-2}...\)这样的形式,可以发现对于原本相同的段在这里就被表示为了一个偶回文子串。

那么问题就变为了划分若干个偶回文子串。设\(f_i\)表示前\(i\)个的方案的话有一种比较简单的做法,建立\(PAM\)后求出每个前缀的所有偶回文后缀,然后暴力转移。

但是这样的是\(O(n^2)\)的,时间复杂度不符合要求,考虑优化。对于一个回文串来说它的所有回文后缀就是它的\(border\)。而\(broder\)有一个性质就是所有\(broder\)的长度可以被划分成\(log\)个等差数列。

我们可以在\(PAM\)上维护这些等差数列,记录\(top_i\)表示节点\(i\)所在的等差数列的顶部,然后每次使用\(top\)往上跳。加入新的\(x\)节点(或者覆盖以前的已经有的节点)的时候累计一下自己作为末尾时所在等差数列方案和就好了

时间复杂度\(O(n\log n)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e6+10,P=1e9+7;
int n,cnt,pos[N],len[N],dis[N],fa[N],top[N],ch[N][26];
char t[N],s[N];int f[N],g[N];
int jump(int x,int p){
while(s[p-len[x]-1]!=s[p])x=fa[x];
return x;
}
int Insert(int x,int p){
x=jump(x,p);
int c=s[p]-'a';
if(!ch[x][c]){
++cnt;len[cnt]=len[x]+2;
int y=jump(fa[x],p);
fa[cnt]=ch[y][c];y=cnt;
dis[y]=len[y]-len[fa[y]];
if(dis[y]!=dis[fa[y]])top[y]=y;
else top[y]=top[fa[y]];ch[x][c]=y;
}
return ch[x][c];
}
int main()
{
scanf("%s",t+1);n=strlen(t+1);
if(n&1)return puts("0")&0;
for(int i=1;i<=n;i+=2)s[i]=t[i/2+1];
for(int i=2;i<=n;i+=2)s[i]=t[n-i/2+1];
len[1]=-1;fa[0]=top[1]=cnt=1;
for(int i=1;i<=n;i++)
pos[i]=Insert(pos[i-1],i);
f[0]=1;
for(int i=1;i<=n;i++){
for(int x=pos[i];x;x=fa[top[x]]){
g[x]=f[i-len[top[x]]];
if(x!=top[x])(g[x]+=g[fa[x]])%=P;
if(!(i&1))(f[i]+=g[x])%=P;
}
}
printf("%d\n",f[n]);
return 0;
}

CF932G-Palindrome Partition【PAM】的更多相关文章

  1. CF932G Palindrome Partition(回文自动机)

    CF932G Palindrome Partition(回文自动机) Luogu 题解时间 首先将字符串 $ s[1...n] $ 变成 $ s[1]s[n]s[2]s[n-1]... $ 就变成了求 ...

  2. 680. Valid Palindrome II【easy】

    680. Valid Palindrome II[easy] Given a non-empty string s, you may delete at most one character. Jud ...

  3. Device &quot;/dev/sdg&quot; is not a partition【再续】

    之前创建asm磁盘的时候总结过一下错误:http://blog.csdn.net/rhys_oracle/article/details/17029333 当今天情况是这种.例如以下: 在使用open ...

  4. Uva - 12050 Palindrome Numbers【数论】

    题目链接:uva 12050 - Palindrome Numbers 题意:求第n个回文串 思路:首先可以知道的是长度为k的回文串个数有9*10^(k-1),那么依次计算,得出n是长度为多少的串,然 ...

  5. CF932G Palindrome Partition

    思路 首先把字符串变为\(S[1]S[n]s[2]s[n-1] \dots\) 这样原来的一个合法的划分方案就变成了用k个长度为偶数的回文子串划分的方案, 然后直接DP,对i位置,可转移的位置就是它的 ...

  6. HDU 2018 Multi-University Training Contest 1 Triangle Partition 【YY】

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6300 Triangle Partition Time Limit: 2000/1000 MS (Java ...

  7. 680. Valid Palindrome II【Easy】【双指针-可以删除一个字符,判断是否能构成回文字符串】

    Given a non-empty string s, you may delete at most one character. Judge whether you can make it a pa ...

  8. 491. Palindrome Number【easy】

    Check a positive number is a palindrome or not. A palindrome number is that if you reverse the whole ...

  9. 洛谷P5496 回文自动机【PAM】模板

    回文自动机模板 1.一个串的本质不同的回文串数量是\(O(n)\)级别的 2.回文自动机的状态数不超过串长,且状态数等于本质不同的回文串数量,除了奇偶两个根节点 3.如何统计所有回文串的数量,类似后缀 ...

随机推荐

  1. ASP.NET Core:ASP.NET Core中使用NLog记录日志

    一.前言 在所有的应用程序中,日志功能是不可或缺的模块,我们可以根据日志信息进行调试.查看产生的错误信息,在ASP.NET Core中我们可以使用log4net或者NLog日志组件来实现记录日志的功能 ...

  2. SpringCloud之Config

    1.背景 在前的学习中,我们几乎解决了springCloud的所有常规应用,但是大家有没有想过这样一个问题: 是使用微服务后,有非常多的application.yml文件,每个模块都有一个,实际开发中 ...

  3. Spring详解(十)------spring 环境切换

    软件开发过程一般涉及"开发 -> 测试 -> 部署上线"多个阶段,每个阶段的环境的配置参数会有不同,如数据源,文件路径等.为避免每次切换环境时都要进行参数配置等繁琐的操 ...

  4. ProjectEuler 009题

    题目: A Pythagorean triplet is a set of three natural numbers, a b c, for which, a2 + b2 = c2 For exam ...

  5. rabbitMq内存与磁盘分配问题

    在服务器上也可以改变配置文件修改内存 也可以使用命令进行分配: 相对内存:rabbitmqctl  set_vm_memory_hgih_waterwmark 0.4     使用时可以把这个0.4替 ...

  6. 在Raspberry Pi 3B+上安装Windows 10 IoT

    下载 进入树莓派下载页面,当前网址https://www.raspberrypi.org/downloads/ 选择Windows 10 IoT Core,当前网址https://docs.micro ...

  7. 对抗生成网络GAN

      该方法常用于: 图像生成 图像修复,训练用了MSE+Global+Local数据,其中Global+Local判别式用于全局+局部一致性. 图像超分辨率重构   GAN的基本原理,主要包含两个网络 ...

  8. MySQL-存储引擎-MERGE

    MERGE存储引擎是一组Myisam表的组合,这些Myisam表必须结构完全相同,MERGE表本身并没有数据,对MERGE类型的表可以进行查询.更新.删除操作,这些操作实际上是对内部的Myisam表进 ...

  9. C#窗体间互相传值

    Demo窗体图片,Form1 Demo窗体图片,Form2 公共委托 using System; namespace _DeleFrm{  public class Dele  {    public ...

  10. Python中的文件处理和数据存储json

    前言:每当需要分析或修改存储在文件中的信息时,读取文件都很有用,对数据分析应用程序来说尤其如此. 例如,你可以编写一个这样的程序:读取一个文本文件的内容,重新设置这些数据的格式并将其写入文件,让浏览器 ...