「Luogu P4987」回文项链 解题报告
题面
求环中的长度为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」回文项链 解题报告的更多相关文章
- 「Luogu P1210」回文检测 解题报告
题面 这是一道诡异的黄题 居然让你求一串吧啦吧啦的东西中 字母(大小写)最长的回文串的长度,还要输出完整的串 吐血 思路: 保持淡定,我们啥都不会,就会Manacher,那就用Manacher大法! ...
- 「Luogu P1435」回文字串 解题报告
题面 主要大衣大意: 给定一个字符串,求至少加入多少个字符才能使字符串变成回文字符串 下面就是我一本正经的胡说八道题解 思路: 很显然,这应该是一道典型的最长公共子序列的题目 因此,主要思想就是DP ...
- 「Luogu P3866」[TJOI2009]战争游戏 解题报告
题面 好难表述啊~ 在n*m的矩阵上,有一些大兵(为0),一些空地(一个正整数),障碍物(-1),现在摧毁一些空地,使所有大兵不能走出矩阵去(代价为表示空地的整数),求最小代价 思路: 网络流最小割 ...
- 「Luogu P2015」二叉苹果树 解题报告
题面 一个二叉树,边数为n\((2<n\le 100)\),每条边有一个权值,求剪枝后剩下p\((1<p<n)\)条边,使p条边的权值和最大 还看不懂?-- 2 5 input:5 ...
- 【九度OJ】题目1192:回文字符串 解题报告
[九度OJ]题目1192:回文字符串 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1192 题目描述: 给出一个长度不超过1000的 ...
- Solution -「LOJ #141」回文子串 ||「模板」双向 PAM
\(\mathcal{Description}\) Link. 给定字符串 \(s\),处理 \(q\) 次操作: 在 \(s\) 前添加字符串: 在 \(s\) 后添加字符串: 求 \(s\ ...
- leetcode 214. 最短回文串 解题报告
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aacecaaa" 输出: "aaa ...
- 洛谷 P4555 [国家集训队]最长双回文串 解题报告
P4555 [国家集训队]最长双回文串 题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为\(n\)的串 ...
- 「CTS2019 | CTSC2019」氪金手游 解题报告
「CTS2019 | CTSC2019」氪金手游 降 智 好 题 ... 考场上签到失败了,没想容斥就只打了20分暴力... 考虑一个事情,你抽中一个度为0的点,相当于把这个点删掉了(当然你也只能抽中 ...
随机推荐
- @bzoj - 3836@ [Poi2014]Tourism
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个n个点,m条边的无向图,其中你在第i个点建立旅游站点的费 ...
- @bzoj - 4524@ [Cqoi2016]伪光滑数
目录 @description@ @solution@ @version - 1@ @version - 2@ @accepted code@ @version - 1@ @version - 2@ ...
- get_magic_quotes_gpc() PHP转义的真正含义
如何正确的理解PHP转 义是一个初学者比较困扰的问题.我们今天为大家简要的讲述了PHP转义的具体含义,希望有所帮助.PHP转义一直困扰着我, 今天认真的看了一下PHP手册, 终于解决了. 在PHP中默 ...
- 2、Dapper的使用
1.表结构介绍: 1)课程表 2)成绩表 3)学生表 2.获取数据库连接的工厂类 需要添加System.Configuration和MySql.Data.MySqlClient引用 namespac ...
- hdu 1217 Arbitrage(佛洛依德)
Arbitrage Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- pip安装软件包报Could not fetch URL
报这个错误的原因是python.org已经不支持TLSv1.0和TLSv1.1了.更新pip可以解决这个问题,但是你不能用命令 pip install --upgrade pip 做更新,因为TLS证 ...
- HDU 1026 BSF+优先队列+记录路径、
#include<iostream> #include<cmath> #include<cstring> #include<cstdio> #inclu ...
- H3C NAT的信息显示和调试
- 符合阿里巴巴代码规范的checkstyle检测文件
一.安装与简介 eclipse和idea都有对应的插件,找到插件安装界面.搜索checkstyle,点击安装后,重启IDE即可.(网上有很多安装教程,就不重复制造轮子了) 二.导入配置文件 在chec ...
- 备战省赛组队训练赛第十四场(UPC)
codeforces:传送门 upc:传送门 外来题解: [1]:https://blog.csdn.net/ccsu_cat/article/details/86707446 [2]:https:/ ...