题面

求环中的长度为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 回文检测

最新文章

  1. IOS lib(.a)库冲突解决办法
  2. [Xamarin] 關於發出Notification 的大小事 (转帖)
  3. ubuntu安装jdk-6u45-linux-x64.bin___ZC_20160423
  4. EasyDarwin返回401 Unauthorized解决方法
  5. 轻量级MVC标准
  6. sql之表连接 筛选条件放在 连接外和放在连接里的区别
  7. kontalk
  8. 安装scrapy
  9. C# 异步和委托学习
  10. libimobiledevice命令
  11. ps人物像发丝的抠图处理
  12. 43.Linux调试测试输入思路
  13. PowerDesigner使用方法
  14. c-lodop云打印实现手机打印 JS语句打印
  15. jquery ----&gt; How to Create a Basic Plugin (翻译)
  16. Aerospike系列:3:aerospike特点分析
  17. Python中网络编程对 listen 函数的理解
  18. 推荐一个网址:在线检查Yam文件语法格式的错误
  19. iOS开发CocoaPods使用
  20. partial分部类

热门文章

  1. Error While Loading Shared Libraries, Cannot Open Shared Object File
  2. 项目中容易出现的BUG预警
  3. 深度学习(二十九)Batch Normalization 学习笔记
  4. GPUtil是一个Python模块,使用nvidia-smi从NVIDA GPU获取GPU状态
  5. Taglib自定义万能标签扩展 DownLoad
  6. LEMP--如何在Ubuntu上安装Linux、Nginx、MySQL和PHP
  7. 极简触感反馈Button组件
  8. POJ 2406 Power Strings next数组循环节应用、
  9. js 键盘事件keyCode 总结
  10. vue组件中data是个函数