洛谷4287:双倍回文

前言:

题目描述:

  • 记字符串\(w\)的倒置为\(w^R\)。例如\((abcd)^R=dcba\)。
  • 如果一个字符串能够表示成\(ww^Rww^R\)的形式,责成他是一个双倍回文。
  • 给定一个字符串,求最长双倍回文子串长度。

输入描述:

  • 输入分为两行,第一行输入一个整数表示字符串的长度。
  • 第二行输入只有英文小写的字符串。

输出描述:

  • 输出一个整数表示答案,如果不存在双倍回文子串,则输出0。

思路:

  • 回文自动机模板题:\(trans\)指针的使用。

    • \(trans\)指针:小于等于当前节点长度一半的最长回文后缀,求法和\(fail\)指针类似。
    • 当新建一个节点后,如果他的长度小于等于2,那么这个结点的\(trans\)指针指向他的\(fail\)节点。
    • 否则的话,我们从他的父亲的\(trans\)指针指向的节点开始跳\(fail\)指针。
    • 直到跳到某个结点所表示的回文串的两侧都能拓展这个字符且拓展后的长度小于等于当前节点长度的一半。
    • 那么新建节点的\(trans\)指针就指向该节点的儿子。
  • 考虑一个字符串满足双倍回文:
    • 当且仅当他的\(trans\)指针指向的节点所表示的回文串长度恰好是这个字符串长度的一半,并且这个\(trans\)指针指向的节点所表示的回文串长度为偶数。
    • 枚举每个节点,不停更新答案。

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e5 + 10; int cnt; //节点个数
int last; //上一个结点
int trie[maxn][30]; //字典树
int len[maxn]; //当前节点的回文串长度
int fail[maxn]; //当前节点的fail指针
int len_str; //字符串的长度
char s[maxn]; //原字符串
int trans[maxn]; //trans指针表示<=当前节点长度一半的最长回文后缀 inline int get_fail(int las, int i)
{
while(s[i - len[las] - 1] != s[i])
las = fail[las];
return las;
} void init()
{
cnt = 1, last = 0;
len[0] = 0, len[1] = -1;
fail[0] = 1, fail[1] = 0;
} void build_PAM()
{
for(int i = 1; i <= len_str; i++)
{
int p = get_fail(last, i);
if(!trie[p][s[i]-'a'])
{
len[++cnt] = len[p] + 2;
fail[cnt] = trie[get_fail(fail[p], i)][s[i]-'a'];
trie[p][s[i]-'a'] = cnt; ///------------顺带求出trans指针
if(len[cnt] <= 2) trans[cnt] = fail[cnt];
///这一题数据较水 博主在这里一开始cnt写的是p
///但是没有被卡掉
///如果他的长度<=2,那么当前节点的trans指向他的fail节点
else
{
int tmp= trans[p];
while((s[i - len[tmp] - 1] != s[i]) || (((len[tmp] + 2)<<1) > len[cnt]))
tmp = fail[tmp];
//开始跳fail指针
//直到跳到某一个节点所表示的回文串两侧都能拓展这个字符
//并且拓展后的长度小于等于当前节点长度的一半.
trans[cnt] = trie[tmp][s[i]-'a'];
}
///------------结束
}
last = trie[p][s[i]-'a'];
}
} int main()
{
scanf("%d", &len_str);
scanf("%s", s + 1); s[0] = '#';
init(); build_PAM();
int ans = 0;
for(int i = 2; i <= cnt; i++) //枚举所有的节点
if((len[trans[i]]<<1)==len[i] && len[trans[i]] % 2 == 0)
ans = max(ans, len[i]);
cout << ans << endl;
return 0;
}

luogu_4287:双倍回文的更多相关文章

  1. 【BZOJ-2342】双倍回文 Manacher + 并查集

    2342: [Shoi2011]双倍回文 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1799  Solved: 671[Submit][Statu ...

  2. BZOJ 2342 双倍回文(manacher算法)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2342 题意:定义双倍回文串为:串的长度为4的倍数且串的前一半.后一半.串本身均是回文的. ...

  3. BZOJ2342: [Shoi2011]双倍回文

    2342: [Shoi2011]双倍回文 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 923  Solved: 317[Submit][Status ...

  4. 【BZOJ2342】双倍回文(回文树)

    [BZOJ2342]双倍回文(回文树) 题面 BZOJ 题解 构建出回文树之后 在\(fail\)树上进行\(dp\) 如果一个点代表的回文串长度为\(4\)的倍数 并且存在长度为它的一半的回文后缀 ...

  5. [SHOI 2011]双倍回文

    Description 题库链接 记一个字符串为 \(X\) ,它的倒置为 \(X^R\) .现在给你一个长度为 \(n\) 的字符串 \(S\) ,询问其最长的形同 \(XX^RXX^R\) 的子串 ...

  6. [SHOI2011]双倍回文

    Description   Input 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. Output 输出文件只有一行,即:输入数据中字符串的最长 ...

  7. BZOJ2342[Shoi2011]双倍回文——回文自动机

    题目描述 输入 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. 输出 输出文件只有一行,即:输入数据中字符串的最长双倍回文子串的长度,如果双倍回文 ...

  8. bzoj千题计划306:bzoj2342: [Shoi2011]双倍回文 (回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=2342 解法一: 对原串构建回文自动机 抽离fail树,从根开始dfs 设len[x]表示节点x表示 ...

  9. 2018.06.30 BZOJ 2342: [Shoi2011]双倍回文(manacher)

    2342: [Shoi2011]双倍回文 Time Limit: 10 Sec Memory Limit: 128 MB Description Input 输入分为两行,第一行为一个整数,表示字符串 ...

随机推荐

  1. netcore3.0 webapi集成Swagger 5.0,Swagger使用

    Swagger使用 1.描述 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务. 作用: 1.接口的文档在线自动生成. 2.功能测试 本文转自 ...

  2. Linux ssh 公私钥配置

    Linux ssh 公私钥配置 ssh 公私钥可实现无密码的情况下直接直接登录到服务端.方便我们管理,而且也可以设置ssh完全通过公私钥登录,不可通过密码登录,来提高我们的服务器安全程度. 配置 生成 ...

  3. 通过静态发现方式部署 Etcd 集群

    在「etcd使用入门」一文中对etcd的基本知识点和安装做了一个简要的介绍,这次我们来说说如何部署一个etcd集群. etcd构建自身高可用集群主要有三种形式: 静态发现: 预先已知etcd集群中有哪 ...

  4. HashSet去重

    class Program     {         static void Main(string[] args)         {             Console.WriteLine( ...

  5. syntax error near unexpected token 脚本报错误解决

    hadoop老师给了一个shell文件,在windows里面瞅了一眼然后在ubuntu环境下运行就报错了.看了一些博客,用vim -b filename查看的时候发现每一行的末尾都多了一个^M.... ...

  6. 【C#常用方法】1.DataTable与List<T>的相互转换

    DataTable与List<T>互转 1.List<T>转DataTable public static DataTable ListToDataTable<T> ...

  7. Java之路---Day13

    2019-10-28-22:40:14 目录 1.Instanceof关键字 2.Final关键字 2.1Final关键字修饰类 2.2Final关键字修饰成员方法 2.3Final关键字修饰局部变量 ...

  8. 关于Mysql datetime类型存储范围测试

    创建一个datetime表 > create table date_time(time datetime); > desc date_time; +-------+----------+- ...

  9. jQuery---jQ动画(普通,滑动,淡入淡出,自定义动画,停止动画),jQuery的事件,jQ事件的绑定/解绑,一次性事件,事件委托,事件冒泡,文档加载

    jQuery---jQ动画(普通,滑动,淡入淡出,自定义动画,停止动画),jQuery的事件,jQ事件的绑定/解绑,一次性事件,事件委托,事件冒泡,文档加载 一丶jQuery动画 show,hide, ...

  10. 全程实操cdh5.14.4中集成安装kylin2.4.1与使用测试

    在cdh5.14.4安装完成并排错完成的情况下,进行如下kylin安装操作: 1.实验环境 三台CentOS 7主机,IP地址 192.168.43.129 cm1 192.168.43.130 cm ...