题面

求环中的长度为k(k为奇数)且回文中心不同的回文串个数

思路:

刚学manacher算法,就送上一道模板题,此题注重对manacher算法的理解

Manacher,但是不用插入其他符号,因为k是奇数,中心一定在字符上

不知道Manacher?

洛谷日报上有讲,但是比较难懂,建议上B站更深入了解下\(\to\)

可以先把代码抄下来,然后一边看讲解一边理解代码含义,这样更能理解

反正我第一遍已经看蒙了

补充和纠正:

关于前几篇题解,一些小细节纠正一下

文末的代码更加简洁易懂

1、这是一个环,要做Manacher就应该拆环为链,第一篇题解说:应该重复复制三次(扩展为原来的三倍),但是实际上两次(扩展为原来的两倍)就够了

2、p数组(p[i])表示的是以i为中心的最长回文串的半径(包括i这个字符),原本的Manacher算法因为加入的额外的#号,而是p[i]表示的是就是原本最长回文串的长度+1,因此求Ans的时候应该用p[i]-1,但是现在我们不加#号了,p[i]表示的就是以i为中心的最长回文串的半径,此时长度就应该表示为p[i]*2-1,意思是半径*2-回文中心重复计算的字符

Code:

#include<bits/stdc++.h>
#define N 1000010//N<<1表示长度扩展为原来的两倍
using namespace std;
int n,k,p[N<<1],ans,res;
char s[N<<1];
void manacher()//标准的Manacher算法,就是没有加'#'号,而且起点为1
{
s[0]='?';
s[2*n+1]='!';
int id=0,mx=0;//id表示目前最长回文串的中心,mx则是右边界
for(int i=1;i<=2*n;i++)
{
if(i<mx)
p[i]=min(p[2*id-i],mx-i);//如果中心在mx范围内,用mx去更新p[i]
else
p[i]=1;
while(s[i-p[i]]==s[i+p[i]])//然后暴力
p[i]++;
if(mx<i+p[i])//更新mx和id
{
id=i;
mx=i+p[i];
}
}
return;
}
int main()
{
int i;
scanf("%d%d",&n,&k);
scanf("%s",s+1);
for(i=1;i<=n;i++)//复制
s[i+n]=s[i];
manacher();//跑一遍Manacher
res=(k+1)>>1;//表示起始的中心i的位置,这个位置是第一个有可能长度为k的回文串的中心(串s[1-k]的中心)
for(i=res;i<=res+n-1;i++)//对于每一个点遍历一次,所以是res+n-1
if(p[i]*2-1>=k)//真正的长度只要大于等于k就是可以的(大于k的可以把他砍成k啊~)
ans++;
printf("%d",ans);
return 0;
}

推荐题目:

一道有趣的黄题 P1210 回文检测

「Luogu P4987」回文项链 解题报告的更多相关文章

  1. 「Luogu P1210」回文检测 解题报告

    题面 这是一道诡异的黄题 居然让你求一串吧啦吧啦的东西中 字母(大小写)最长的回文串的长度,还要输出完整的串 吐血 思路: 保持淡定,我们啥都不会,就会Manacher,那就用Manacher大法! ...

  2. 「Luogu P1435」回文字串 解题报告

    题面 主要大衣大意: 给定一个字符串,求至少加入多少个字符才能使字符串变成回文字符串 下面就是我一本正经的胡说八道题解 思路: 很显然,这应该是一道典型的最长公共子序列的题目 因此,主要思想就是DP ...

  3. 「Luogu P3866」[TJOI2009]战争游戏 解题报告

    题面 好难表述啊~ 在n*m的矩阵上,有一些大兵(为0),一些空地(一个正整数),障碍物(-1),现在摧毁一些空地,使所有大兵不能走出矩阵去(代价为表示空地的整数),求最小代价 思路: 网络流最小割 ...

  4. 「Luogu P2015」二叉苹果树 解题报告

    题面 一个二叉树,边数为n\((2<n\le 100)\),每条边有一个权值,求剪枝后剩下p\((1<p<n)\)条边,使p条边的权值和最大 还看不懂?-- 2 5 input:5 ...

  5. 【九度OJ】题目1192:回文字符串 解题报告

    [九度OJ]题目1192:回文字符串 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1192 题目描述: 给出一个长度不超过1000的 ...

  6. Solution -「LOJ #141」回文子串 ||「模板」双向 PAM

    \(\mathcal{Description}\)   Link.   给定字符串 \(s\),处理 \(q\) 次操作: 在 \(s\) 前添加字符串: 在 \(s\) 后添加字符串: 求 \(s\ ...

  7. leetcode 214. 最短回文串 解题报告

    给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aacecaaa" 输出: "aaa ...

  8. 洛谷 P4555 [国家集训队]最长双回文串 解题报告

    P4555 [国家集训队]最长双回文串 题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为\(n\)的串 ...

  9. 「CTS2019 | CTSC2019」氪金手游 解题报告

    「CTS2019 | CTSC2019」氪金手游 降 智 好 题 ... 考场上签到失败了,没想容斥就只打了20分暴力... 考虑一个事情,你抽中一个度为0的点,相当于把这个点删掉了(当然你也只能抽中 ...

随机推荐

  1. Python深入:Distutils安装包

    一:简介 尽管Python标准库已经支持很多的功能,但是有时还是会需要以第三方模块的形式添加新的功能到Python中. 在最简单的场景中,是你要安装的模块,已经有了针对你的平台的安装版本,因此只需要像 ...

  2. Project Euler Problem 23-Non-abundant sums

    直接暴力搞就行,优化的地方应该还是计算因子和那里,优化方法在这里:http://www.cnblogs.com/guoyongheng/p/7780345.html 这题真坑,能被写成两个相同盈数之和 ...

  3. STS Eclipse IDEA 指定启动JDK版本

    使用场景: 开发人员在自己的机器上可能装了多个版本的JDK,但是在环境变量中只能配置一个 JAVA_HOME ,so你的IDEA Eclipse 可能因为你在 JAVA_HOME 配置JDK1.8 以 ...

  4. 随机线性网络编码的C语言实现,实现可靠传输:实现篇(2)

    伽罗华域(2^8)乘除法的编程实现

  5. poj 1066 Treasure Hunt (Geometry + BFS)

    1066 -- Treasure Hunt 题意是,在一个金字塔中有一个宝藏,金字塔里面有很多的墙,要穿过墙壁才能进入到宝藏所在的地方.可是因为某些原因,只能在两个墙壁的交点连线的中点穿过墙壁.问最少 ...

  6. poj 3675 Telescope (圆与多边形面积交)

    3675 -- Telescope 再来一题.这题的代码还是继续完全不看模板重写的. 题意不解释了,反正就是一个单纯的圆与多边形的交面积. 这题的精度有点搞笑.我用比较高的精度来统计面积,居然wa了. ...

  7. 怎么查看mysql 的binlog日志存放的位置

    image.png 这个你可以看配置文件 启用了才有这样的记录默认是没有的 linux系统中的/etc/my.cnf my.cnf内容: log-bin = mysqlbin # 默认配置 一般放在/ ...

  8. 2011-04-21 运程连Oracle的方法

    oracle无法远程连接重要原因,即使防火墙开放1521端口, 但是返回包可能是随机端口,所以仍有可能被防火墙阻止. 解决方法: 在注册表中增加一个字符串值如下.可解决 花费两天找到的方法 [HKEY ...

  9. angular input框点击别处 变成不可输入状态

    <input type="text" ng-model="edit" ng-disabled="!editable" focus-me ...

  10. 只要是使用函数file_get_contents访问 https 的网站都要开启

    使用file_get_contents();报错failed to open stream: Unable to find the socket transport "ssl" - ...