洛谷题目传送门

写完有一段时间了,发现板子忘记存在了这里。。。。。。

算法简述

一种字符串算法,\(O(n)\)高效求出以每个字符为对称中心的最长回文串长度。

然后,就可以进一步求出全串中最长回文串的长度,以及全串回文子串总数。

这篇博客已经讲的很清楚了。

有一个小细节还需要提一下。为了方便判断下标是否越界问题,我们可以这样做——将字符串从一号下标开始存储,然后在零号下标放一个与串中所有字符都不同的字符(包括中间插入的字符)。这样在扫到边界的时候,一定会匹配失败。这样少写了好几个if,非常方便。

其它就没什么问题了。模板如下:

#include<cstdio>
char s[23333333];
int f[23333333];
inline int min(register int x,register int y){return x<y?x:y;}
int main()
{
register int len,i,l,r,mr=0,m=0,ans=0;
s[0]='~';s[1]='%';//上面提到的小细节
for(len=2;(s[len]=getchar())>='a';len+=2)
s[len|1]='%';
for(i=1;i<len;++i)
{
if(i<mr)f[i]=min(f[(m<<1)-i],mr-i);//最大化利用前面的信息
for(l=i-f[i]-1,r=i+f[i]+1;s[l]==s[r];--l,++r,++f[i]);//继续向两侧匹配
if(mr<r-1)mr=r-1,m=i;//更新最大可行右端点
if(ans<f[i])ans=f[i];//更新最大长度
}
printf("%d\n",ans);
return 0;
}

另外,向中间插入使得字符串长度增加了一倍。我在洛谷rank榜第一名的代码中看到,这位神犇居然没插字符!时间也基本比我少一半。

我还是懒得整理啦(其实是因为我太菜了)。可能会对奇数长度回文子串和偶数长度回文字串进行分别处理吧。有兴趣的博友们可以自己研究一下哦!

manacher模板(manacher)的更多相关文章

  1. ural 1297 Palindrome(Manacher模板题)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 求最长回文子串. http://acm.timus.ru/problem.aspx ...

  2. HDU 3068 最长回文(manacher模板题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 题目大意:求字符串s中最长的回文子串 解题思路:manacher模板 代码 #include&l ...

  3. HDU 3068 最长回文( Manacher模板题 )

    链接:传送门 思路:Manacher模板题,寻找串中的最长回文子串 /***************************************************************** ...

  4. HDU3068:最长回文(Manacher模板)

    最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. 洛谷P3805 [模板]Manacher算法 [manacher]

    题目传送门 题目描述 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 输入输出格式 输入格式: 一行小写英文字符a,b,c...y,z组成的字符 ...

  6. Manacher模板( 线性求最长回文子串 )

    模板 #include<stdio.h> #include<string.h> #include<algorithm> #include<map> us ...

  7. Palindrome - POJ 3974 (最长回文子串,Manacher模板)

    题意:就是求一个串的最长回文子串....输出长度. 直接上代码吧,没什么好分析的了.   代码如下: ================================================= ...

  8. manacher 模板

    求最长回文子序列的 O(n)做法 讲解 #include <iostream> #include <cstdio> #include <algorithm> #in ...

  9. 模板 manacher算法

    题目描述 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 输入输出格式 输入格式: 一行小写英文字符a,b,c...y,z组成的字符串S 输出格 ...

  10. 最长回文(manacher模板)

    #include<iostream> #include<algorithm> #include<cstring> #include<cstdio> us ...

随机推荐

  1. EFCore数据库迁移命令整理

    前言  因为现在用.net core 开发新项目,过程中需要经常涉及到数据命令的迁移,今天分别整EFCore 的两种迁移数据库的方式 1 程序包管理器控制台 , Package Manager Con ...

  2. “茴”字有四种写法,this也是一样

    说到这个地方又想起以前高中还是初中学的<孔乙己>这个梗,但是这里的this显然实用性比那个要大很多,哈哈. 简单来说,this有四种应用场景,分别是在构造函数上.对象属性中.普通函数中.c ...

  3. 脚本启用python虚拟环境

    #!/bin/bash rm -rf /data/website/activities/virtualenvvirtualenv --no-site-packages -p python3 /data ...

  4. 哪些CSS是可以被继承的--简单整理

    那些CSS是可以被继承的--简单整理1.文本相关属性是继承的:font-size,font-family,line-height,text-index等2.列表相关属性是继承的:list-style- ...

  5. Tomcat8+Spring-Security 启用安全通道(https)的一步步实现

    近日学习Spring Security框架,学习到利用安全框架完成系统的安全通道控制时,来来回回遇到了不少问题.spring教程上写的略简单,对于我等小白来讲不足以支撑看书编码,好在网络上有资料可以查 ...

  6. java定时器schedule和scheduleAtFixedRate区别

    package cn.lonecloud.test; import java.util.Date; import java.util.Timer; import java.util.TimerTask ...

  7. .addClass(),.removeClass(),.toggleClass()的区别

    .addClass("className")方法是用来给指定元素增加类名,也就是说给指定的元素追加样式: 可以同时添加多个类名,空格符隔开 $("selector&quo ...

  8. 进入Docker容器

    在进入Docker容器之前,首先要运行对应的Docker容器,先使用命令docker ps查看正在运行的容器. docker inspect --format='{{.NetworkSettings. ...

  9. javascript 函数详解

    一.函数的一些基础概念: 1.js中的函数使用function来声明. 2.关于return: 2.1  函数在执行到return语句后悔立即停止并退出,return后面的代码永远不会得到执行: 2. ...

  10. 有状态InheritableThreadLocal 配合 JDK8 ,异步方法调用

    我们可以把一个类的作用域注解为 @Scope(scopeName = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode. ...