BZOJ2565 最长双回文子串 回文自动机,回文树
bzoj2565: 最长双回文串
题意
这道题可以用manacher算法解决,但是用manacher解决问题的同时,有可能需要计算长度的关系,可能会出现混乱。在这里采用更清楚的回文自动机;
在做这道题之前需要掌握的知识是回文自动机的实现和作用,如果有不了解算法的同志,请自行翻大神博客进行学习:
https://www.cnblogs.com/crazyacking/p/5234823.html
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 最长双回文子串 回文自动机,回文树相关推荐
- 求字符串中回文子串的个数(回文树详解)
写法一: #include<stdio.h> #include<iostream> #include<algorithm> #include<string.h ...
- 最长回文子串(Longest Palindromic Substring)
转载自 最长回文子串(Longest Palindromic Substring)--三种时间复杂度的解法 子串:小于等于原字符串长度由原字符串中任意个连续字符组成的子序列 回文:关于中间字符对称的 ...
- 怎么判断一个字符串的最长回文子串是否在头尾_回文自动机入门
缘起 回文自动机(Palindrome auto machine PAM,有些地方称之为回文树)是回文问题的大杀器~ 本文使用一道很简单的题目入门这个精巧的数据结构. hdu 2163 Palind ...
- 数据结构-----最长回文子串
题目描述 给定一个字符串,找出该字符串的最长回文子串.回文字符串指的就是从左右两边看都一样的字符串,如aba,cddc都是回文字符串.字符串abbacdc存在的回文子串有abba和cdc,因此它的最长 ...
- 力扣Leetcode:5. 最长回文子串(Python)
题目描述 给你一个字符串 s,找到 s 中最长的回文子串. 题解:动态规划 这是一道很经典的题目.首先我想到了动态规划算法: 对于子串s[i-j],它为回文子串的条件为:s[i+1 - j-1]为回文 ...
- C语言实现:最长回文子串算法
1.问题描述: 给定一个字符串,求它的最长回文子串的长度. 回文定义:字符串的逆序和其本身一致.(例如:abcba) 2.两种解法: 2.1.中心扩散法: 思路: 验证回文是从字符串两端开始对比,算法 ...
- 最长回文子串(C/C++动态规划)
题目描述 输入一个字符串Str,输出Str里最长回文子串的长度. 回文串:指aba.abba.cccbccc.aaaa这种左右对称的字符串. 串的子串:一个串的子串指此(字符)串中连续的一部分字符构成 ...
- 牛客网【每日一题】3月26日 合并回文子串
题号:NC13230 名称:合并回文子串 来源:美团2017年CodeM大赛-初赛A轮 题目链接 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K ...
- CodeM美团点评编程大赛初赛A轮 B.合并回文子串【区间Dp】
[编程题] 合并回文子串 时间限制:2秒 空间限制:262144K 输入两个字符串A和B,合并成一个串C,属于A和B的字符在C中顺序保持不变.如"abc"和"xyz&qu ...
最新文章
- Nature:13个维度,手把手教“研究er”如何做报告
- kubernetes(k8s)之yaml文件详解
- docker镜像启动后端口号是多少_14,Docker容器必知必会,你会了吗?
- Spring MVC 登录拦截器
- Part7 继承与派生 7.4派生类的构造和析构
- k8s学习笔记-Docker篇
- 《python核心编程》笔记——系统限制
- 查看dll是32还是64
- activeMq安装及原理分析
- xmapp_mysql端口冲突解决
- android10禁用华为桌面,华为禁用第三方桌面 简介办法
- 【UC浏览器】PPC/SP平台7.0正式版发布啦
- FFmpeg 异常:height not divisible by 2
- 4、GET和POST的区别
- java调用腾讯地图根据经纬度获取位置信息
- 导出富文本格式word
- Ext 4 概述(一)
- [AT2442]フェーン現象 (Foehn Phenomena)
- python求解100以内的素数并输出(递归)
- rp3399之mipi接口ov4689摄像头驱动
热门文章
- 1.6编程基础之一维数组_01与指定数字相同的数的个数
- 如何系统地自学python100天_如何系统地自学 Python?
- 信息安全工程师笔记-恶意代码防范技术原理
- Spring Boot文档阅读笔记-exception handling–@ExceptionHandler解析与实例
- Spring Boot笔记-利用Quartz进行定时任务,利用websocket推送到浏览器(界面为thymeleaf)
- Qt笔记-QxOrm基本使用(对SQLLite进行增删改查)
- Arduino笔记-定时器中断(MsTimer2库使用)
- OpenCV文档阅读笔记-cvtColor官方解析及实例
- 大四课程设计之基于RFID技术的考勤管理系统(二)读取COM口数据
- java编写一个程序_计算已知长和宽的长方形的周长,请教一下大佬们,我们java留了一个作业,编写程序,定义一个接口Comput,声明计算周长和面积的方法...