马拉车算法——poj3974
https://segmentfault.com/a/1190000008484167?tdsourcetag=s_pctim_aiomsg 讲的超好!
manacher算法理解
回文串分为偶回文串和奇回文串,由于偶回文串无法找到中点,所以这里将偶回文串转换为奇回文
转换方法s="abcde"=>s="$#a#b#c#d#e#"
数组p[i],表示以i为中心的最长回文的半径,p[i]-1刚好是以i为中心的源字符串中的回文长度
从左往右扫描s,求出p数组
mx:延伸到最右边的回文的边界(不包含 )
id:mx对应的中点
现在扫到了i,i关于id对称点是j,p[j]已知,以下分三种种情况
1.i<mx:p[i]=min(p[j],mx-i),i在mx左边
2.i>=mx:p[i]=1 ,i在mx的右边
3.往两边拓展边界
求出p[i]后更新mx即可 为什么复杂度是on?
当且仅当j的边界和mx重合时,i才要向两边扩展,
#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
char s[maxn],s_new[maxn];
int p[maxn];
int init(){
int len=strlen(s);
s_new[]='$',s_new[]='#';
int j=;
for(int i=;i<len;i++)
s_new[j++]=s[i],s_new[j++]='#';
s_new[j]='\0';
return j;
}
int manacher(){
int len=init();
int res=,id,mx=;
for(int i=;i<len;i++){
if(i<mx)
p[i]=min(p[*id-i],mx-i);
else
p[i]=;
//当且仅当边界处于mx的时候(两边的匹配状况未知),才会进入循环
while(s_new[i-p[i]]==s_new[i+p[i]])
p[i]++;
if(mx<i+p[i])
mx=i+p[i],id=i;
res=max(res,p[i]-);
}
return res;
} int main(){
cin>>s;
cout<<manacher();
}
poj3974
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define maxn 3000005
int p[maxn],tt;
char s[maxn],s_new[maxn];
int init(){
int len=strlen(s);
s_new[]='$',s_new[]='#';int j=;
for(int i=;i<len;i++)
s_new[j++]=s[i],s_new[j++]='#';
s_new[j]=;
return j;
}
int manacher(){
int len=init();
int mx=,id,res=;
for(int i=;i<len;i++){
if(i<mx)p[i]=min(p[*id-i],mx-i);
else p[i]=;
while(s_new[i+p[i]]==s_new[i-p[i]])p[i]++;
if(i+p[i]>mx)
mx=i+p[i],id=i;
res=max(res,p[i]-);
}
return res;
}
int main(){
while(scanf("%s",s)){
if(s[]=='E')break;
memset(p,,sizeof p);
printf("Case %d: %d\n",++tt,manacher());
}
}
马拉车算法——poj3974的更多相关文章
- Manacher's Algorithm 马拉车算法
这个马拉车算法Manacher‘s Algorithm是用来查找一个字符串的最长回文子串的线性方法,由一个叫Manacher的人在1975年发明的,这个方法的最大贡献是在于将时间复杂度提升到了线性,这 ...
- 字符串(马拉车算法,后缀数组,稀疏表):BZOJ 3676 [Apio2014]回文串
Description 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最 大出现值. Input 输入只有一行 ...
- 小白月赛13 B小A的回文串 (马拉车算法求最长回文子串)
链接:https://ac.nowcoder.com/acm/contest/549/B来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...
- BZOJ 2342: [Shoi2011]双倍回文 马拉车算法/并查集
2342: [Shoi2011]双倍回文 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1123 Solved: 408 题目连接 http://w ...
- 2015 UESTC 搜索专题M题 Palindromic String 马拉车算法
Palindromic String Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/s ...
- 647. Palindromic Substrings(马拉车算法)
问题 求一个字符串有多少个回文子串 Input: "abc" Output: 3 Input: "aaa" Output: 6 思路和代码(1)--朴素做法 用 ...
- Manacher's Algorithm 马拉车算法(最长回文串)
这个马拉车算法Manacher‘s Algorithm是用来查找一个字符串的最长回文子串的线性方法,由一个叫Manacher的人在1975年发明的,这个方法的最大贡献是在于将时间复杂度提升到了线性,这 ...
- 马拉车算法(Manacher's Algorithm)
这是悦乐书的第343次更新,第367篇原创 Manacher's Algorithm,中文名叫马拉车算法,是一位名叫Manacher的人在1975年提出的一种算法,解决的问题是求最长回文子串,神奇之处 ...
- HDU - 3068 最长回文manacher马拉车算法
# a # b # b # a # 当我们遇到回判断最长回文字符串问题的时候,若果用暴力的方法来做,就是在字符串中间添加 #,然后遍历每一个字符,找到最长的回文字符串.那么马拉车算法就是在这个基础上进 ...
随机推荐
- Python TypeError: not all arguments converted during string formatting ——元组tuple(a)和(a,)的区别
今天写程序,想输出一个array的shape,原程序为: print('shape of testUImatrix:%s\nStart to make testUImatrix...'%(testui ...
- hihoCoder #1954 : 压缩树(虚树)
题意 有一棵 \(n\) 个节点且以 \(1\) 为根的树,把它复制成 \(m\) 个版本,有 \(q\) 次操作,每次对 \([l, r]\) 这些版本的 \(v\) 节点到根的路径收缩起来. 收缩 ...
- JDK源码分析(9) LinkedHashMap
概述 LinkedHashMap是一个关联数组.哈希表,它是线程不安全的,允许key为null,value为null.他继承自HashMap,实现了Map<K,V>接口.其内部还维护了一个 ...
- bzoj1814 Ural 1519 Formula 1(插头DP)
对插头DP的理解还不是很透彻. 先说一下肤浅的理解吧. 插头DP使用范围:指数级复杂度,且适用于解决网格图连通性问题,如哈密顿回路等问题.插头一般指每相邻2个网格的接口. 题目难度:一般不可做. 使用 ...
- 快速找出网站中可能存在的XSS漏洞实践
笔者写了一些XSS漏洞的挖掘过程记录下来,方便自己也方便他人. 一.背景 在本篇文章当中会一permeate生态测试系统为例,笔者此前写过一篇文章当中笔者已经讲解如何安装permeate渗透测试系统, ...
- EF Code First一对一、一对多、多对多关联关系配置
1.EF Code First一对一关联关系 项目结构图: 实体类: Account.cs using System; using System.Collections.Generic; using ...
- Jdk和Spring Boot版本选择
==========================版本选择的原则:==========================1. 优先选择官方指定的long-term support(LTS)版本, 非L ...
- 神奇的 UNICODE 字符 : U+202E
- 三步法搞定CTF中的SQL注入题型
三步法: 一.找到注入点 二.Fuzz出未过滤字符 三.构造payload/写脚本 例题1 打开题目: 第一步,寻找注入点. 输入用户名123456,密码123456,返回结果username err ...
- python selenium 最简单示例
使用 pip 安装 selenium 下载 chromedriver,添加在PATH中 # -*- coding: utf-8 -*- from selenium import webdriver ...