bzoj2565: 最长双回文串

题意

顺序和逆序读起来完全一样的串叫做回文串。比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同)。
输入长度为n的串S,求S的最长双回文子串T,即可将T分为两部分X,Y,(|X|,|Y|≥1)且X和Y都是回文串。 N<=100000。

这道题可以用manacher算法解决,但是用manacher解决问题的同时,有可能需要计算长度的关系,可能会出现混乱。在这里采用更清楚的回文自动机;

在做这道题之前需要掌握的知识是回文自动机的实现和作用,如果有不了解算法的同志,请自行翻大神博客进行学习:

https://www.cnblogs.com/crazyacking/p/5234823.html

在这里,由于是要找两个回文串,还必须是相邻的,所以我们可以通过把整串翻转的方法实现求相邻回文串,根据回文树的作用,可以求出以下标i结尾的最长回文字符串,注意是以下标i结尾的最长串,而不是开始,不理解的话可以自己模拟一下字符加进回文自动机形成回文自动机的那些步骤,求出来之后可以枚举相邻的那个点来进行转移,求出最长的双回文串,这道题就结束了,现在上代码:

 1 #include<iostream>
 2 #include<cmath>
 3 #include<cstdio>
 4 #include<cstdlib>
 5 #include<algorithm>
 6 #include<cstring>
 7 #include<string>
 8 #include<queue>
 9 using namespace std;
10 const int MAXN=100005;
11 int nxt[MAXN][26],fail[MAXN],len[MAXN],num[MAXN],cnt[MAXN],mx1[MAXN],mx2[MAXN];
12 int n,m,k,l,r,last,p=0;
13 char s[MAXN],ops[MAXN];
14 inline int getfail(int x)
15 {
16     while(s[n-len[x]-1]!=s[n]) x=fail[x];
17     return x;
18 }
19 inline void add(int x,int i,int *mx)
20 {
21     last=getfail(last);
22     if(nxt[last][x]==0){
23         len[++p]=len[last]+2;
24         fail[p]=nxt[getfail(fail[last])][x];
25         nxt[last][x]=p;
26         num[p]=num[fail[p]]+1;
27     }
28     last=nxt[last][x];
29     mx[i]=len[last];
30     cnt[last]++;
31     return ;
32 }
33 int main()
34 {
35     scanf("%s",s+1);
36     m=strlen(s+1);
37     p=last=n=0;
38     len[++p]=-1;
39     fail[0]=p;
40     for(int i=1;i<=m;i++){
41         n++;
42         add(s[i]-'a',i,mx1);
43     }
44     memset(fail,0,sizeof(fail));
45     memset(cnt,0,sizeof(cnt));
46     memset(num,0,sizeof(num));
47     memset(len,0,sizeof(len));
48     memset(nxt,0,sizeof(nxt));
49     p=last=n=0;len[++p]=-1;fail[0]=p;
50     for(int i=1;i<=m;i++){
51         ops[i]=s[m-i+1];
52     }
53     for(int i=1;i<=m;i++){
54         s[i]=ops[i];
55     }
56     for(int i=1;i<=m;i++){
57         n++;
58         add(s[i]-'a',i,mx2);
59     }
60     int ans=-1;
61     for(int i=1;i<=m;i++){
62         ans=max(ans,mx1[i]+mx2[m-i+0]);
63     }
64     cout<<ans<<endl;
65     return 0;
66 } 

转载于:https://www.cnblogs.com/Alan-Luo/articles/9160813.html

BZOJ2565 最长双回文子串 回文自动机,回文树相关推荐

  1. 求字符串中回文子串的个数(回文树详解)

    写法一: #include<stdio.h> #include<iostream> #include<algorithm> #include<string.h ...

  2. 最长回文子串(Longest Palindromic Substring)

    转载自  最长回文子串(Longest Palindromic Substring)--三种时间复杂度的解法 子串:小于等于原字符串长度由原字符串中任意个连续字符组成的子序列 回文:关于中间字符对称的 ...

  3. 怎么判断一个字符串的最长回文子串是否在头尾_回文自动机入门

    缘起 回文自动机(Palindrome auto machine PAM,有些地方称之为回文树)是回文问题的大杀器~  本文使用一道很简单的题目入门这个精巧的数据结构. hdu 2163 Palind ...

  4. 数据结构-----最长回文子串

    题目描述 给定一个字符串,找出该字符串的最长回文子串.回文字符串指的就是从左右两边看都一样的字符串,如aba,cddc都是回文字符串.字符串abbacdc存在的回文子串有abba和cdc,因此它的最长 ...

  5. 力扣Leetcode:5. 最长回文子串(Python)

    题目描述 给你一个字符串 s,找到 s 中最长的回文子串. 题解:动态规划 这是一道很经典的题目.首先我想到了动态规划算法: 对于子串s[i-j],它为回文子串的条件为:s[i+1 - j-1]为回文 ...

  6. C语言实现:最长回文子串算法

    1.问题描述: 给定一个字符串,求它的最长回文子串的长度. 回文定义:字符串的逆序和其本身一致.(例如:abcba) 2.两种解法: 2.1.中心扩散法: 思路: 验证回文是从字符串两端开始对比,算法 ...

  7. 最长回文子串(C/C++动态规划)

    题目描述 输入一个字符串Str,输出Str里最长回文子串的长度. 回文串:指aba.abba.cccbccc.aaaa这种左右对称的字符串. 串的子串:一个串的子串指此(字符)串中连续的一部分字符构成 ...

  8. 牛客网【每日一题】3月26日 合并回文子串

    题号:NC13230 名称:合并回文子串 来源:美团2017年CodeM大赛-初赛A轮 题目链接 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K ...

  9. CodeM美团点评编程大赛初赛A轮 B.合并回文子串【区间Dp】

    [编程题] 合并回文子串 时间限制:2秒 空间限制:262144K 输入两个字符串A和B,合并成一个串C,属于A和B的字符在C中顺序保持不变.如"abc"和"xyz&qu ...

最新文章

  1. Nature:13个维度,手把手教“研究er”如何做报告
  2. kubernetes(k8s)之yaml文件详解
  3. docker镜像启动后端口号是多少_14,Docker容器必知必会,你会了吗?
  4. Spring MVC 登录拦截器
  5. Part7 继承与派生 7.4派生类的构造和析构
  6. k8s学习笔记-Docker篇
  7. 《python核心编程》笔记——系统限制
  8. 查看dll是32还是64
  9. activeMq安装及原理分析
  10. xmapp_mysql端口冲突解决
  11. android10禁用华为桌面,华为禁用第三方桌面 简介办法
  12. 【UC浏览器】PPC/SP平台7.0正式版发布啦
  13. FFmpeg 异常:height not divisible by 2
  14. 4、GET和POST的区别
  15. java调用腾讯地图根据经纬度获取位置信息
  16. 导出富文本格式word
  17. Ext 4 概述(一)
  18. [AT2442]フェーン現象 (Foehn Phenomena)
  19. python求解100以内的素数并输出(递归)
  20. rp3399之mipi接口ov4689摄像头驱动

热门文章

  1. 1.6编程基础之一维数组_01与指定数字相同的数的个数
  2. 如何系统地自学python100天_如何系统地自学 Python?
  3. 信息安全工程师笔记-恶意代码防范技术原理
  4. Spring Boot文档阅读笔记-exception handling–@ExceptionHandler解析与实例
  5. Spring Boot笔记-利用Quartz进行定时任务,利用websocket推送到浏览器(界面为thymeleaf)
  6. Qt笔记-QxOrm基本使用(对SQLLite进行增删改查)
  7. Arduino笔记-定时器中断(MsTimer2库使用)
  8. OpenCV文档阅读笔记-cvtColor官方解析及实例
  9. 大四课程设计之基于RFID技术的考勤管理系统(二)读取COM口数据
  10. java编写一个程序_计算已知长和宽的长方形的周长,请教一下大佬们,我们java留了一个作业,编写程序,定义一个接口Comput,声明计算周长和面积的方法...