博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Gym 101350I - Mirrored String II ( Manacher马拉车算法 -- 最长回文子串 )
阅读量:4670 次
发布时间:2019-06-09

本文共 1254 字,大约阅读时间需要 4 分钟。

题意

给一个字符串, 求最长回文镜像子串长度

思路

Manacher + 镜像判断

算法实现 :

AC代码 ( kuangbin板子 )

#include 
#include
#include
#include
#define mst(a) memset(a,0,sizeof(a))using namespace std;const int maxn = 1e3+10;int len;char mrk[] = "A HI M O TUVWXY ";char Ma[maxn*2];int Mp[maxn*2];void Manacher( char s[], int len ){ int l = 0; Ma[l++] = '$'; Ma[l++] = '#'; for( int i = 0; i < len; i++ ){ Ma[l++] = s[i]; Ma[l++] = '#'; } Ma[l] = 0; int mx = 0, id = 0; for( int i = 0; i < l; i++ ){ Mp[i] = mx > i ? min(Mp[2*id-i], mx-i) : 1; while( Ma[i+Mp[i]] == Ma[i-Mp[i]] && mrk[Ma[i+Mp[i]]-'A'] != ' ' && mrk[Ma[i-Mp[i]]-'A'] != ' ' ) Mp[i]++; if( i+Mp[i] > mx ){ mx = i + Mp[i]; id = i; } }}char s[maxn];int main(){ int T; scanf("%d",&T); while(T--){ mst(s); mst(Ma); mst(Mp); scanf("%s",s); len = strlen(s); Manacher(s, len); int ans = 0; for( int i = 0; i < 2*len+2; i++ ) if( mrk[Ma[i]-'A'] != ' ' ) ans = max(ans, Mp[i]-1); printf("%d\n",ans); } return 0;}

转载于:https://www.cnblogs.com/JinxiSui/p/9740572.html

你可能感兴趣的文章
MYSQL中的日期转换
查看>>
在线修改Schema
查看>>
【学术篇】SDOI2008 仪仗队
查看>>
5.递归实现,把M元用最少的硬币来凑。不同面值的硬币,有10元,5元,2元,1元。...
查看>>
第6章—渲染web视图—使用Thymeleaf
查看>>
Android动态添加Fragment
查看>>
OGRE粒子系统简介
查看>>
C、C++语言中参数的压栈顺序
查看>>
用jquery实现简单的表单验证
查看>>
自然语言3——官网介绍
查看>>
lucene 搜索学习笔记 - OK
查看>>
Java的垃圾回收
查看>>
java中的与或运算
查看>>
Pycharm连接BitBucket
查看>>
ftp 批量上传文件命令
查看>>
nlog自定义文件名
查看>>
java环境变量配置
查看>>
Mysql中文乱码问题解决
查看>>
make clean指令出现问题
查看>>
巴中故里
查看>>