1089 最长回文子串 V2(Manacher算法)


- 输入Str(Str的长度 <= 100000)
- 输出最长回文子串的长度L。
- daabaac
- 5
- //O(n) manacher算法
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- using namespace std;
- const int N=1e6+;
- int l,len,p[N<<];
- char s[N],S[N<<];
- void manacher(){
- int ans=,id=,mx=-;
- for(int i=;i<l;i++){
- if(id+mx>i) p[i]=min(p[id*-i],id+mx-i);
- while(i-p[i]->=&&i+p[i]+<=l&&S[i-p[i]-]==S[i+p[i]+]) p[i]++;
- if(id+mx<i+p[i]) id=i,mx=p[i];
- ans=max(ans,p[i]);
- }
- printf("%d\n",ans);
- }
- int main(){
- scanf("%s",s);len=strlen(s);
- l=-;
- for(int i=;i<len;i++) S[++l]='#',S[++l]=s[i];
- S[++l]='#';
- manacher();
- return ;
- }
- //O(nlogn) 字符串哈希
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- using namespace std;
- typedef int i64;
- const int N=1e6+;
- int n,m,ans,a[N];char s[N];
- i64 P,pow[N],hash_l[N],hash_r[N];
- void get_hash(){
- pow[]=;
- for(int i=;i<=m;i++) pow[i]=pow[i-]*P;
- for(int i=;i<=m;i++) hash_r[i]=hash_r[i-]*P+a[i];
- for(int i=m;i>=;i--) hash_l[i]=hash_l[i+]*P+a[i];
- }
- int main(){
- P=;
- scanf("%s",s+);
- n=strlen(s+);
- for(int i=;i<=n;i++){
- a[++m]='#';
- a[++m]=s[i]-'A';
- }
- a[++m]='#';
- get_hash();
- int l,r,mid;
- for(int i=;i<=m;i++){
- l=;
- if(i-<m-i) r=i;
- else r=m-i+;
- while(r-l>){
- mid=l+r>>;
- i64 hash_to_l=hash_r[i-]-hash_r[i-mid-]*pow[mid];
- i64 hash_to_r=hash_l[i+]-hash_l[i+mid+]*pow[mid];
- if(hash_to_l==hash_to_r) l=mid;
- else r=mid;
- }
- ans=max(ans,l);
- }
- printf("%d",ans);
- return ;
- }
1089 最长回文子串 V2(Manacher算法)的更多相关文章
- 51Nod 1089 最长回文子串 V2 —— Manacher算法
题目链接:https://vjudge.net/problem/51Nod-1089 1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: ...
- 51 Nod 1089 最长回文子串(Manacher算法)
1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 回文串是指aba.abba.cccbccc.aaa ...
- 51nod 1089最长回文子串V2 (manacher)
经典题 manacher是一种很神奇的算法, 算是动态规划的一种,不过利用的信息非常有效 #include <iostream> #include <cstdio> #incl ...
- 51NOD 1088 最长回文子串&1089 最长回文子串 V2(Manacher算法)
回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串. 输入一个字符串Str,输出Str里最长回文子串的长度. Input 输入Str(Str的长度 <= 1000(第二题要 ...
- 51nod(1089 最长回文子串 V2)(hash 加二分)
1089 最长回文子串 V2(Manacher算法) 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串. 输入一个字符串Str,输出Str里最长回文子串的长度. 输入 ...
- Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法)
Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法) Given a string s, find the longest pal ...
- 最长回文子串的Manacher算法
对于一个比较长的字符串,O(n^2)的时间复杂度是难以接受的.Can we do better? 先来看看解法2存在的缺陷. 1) 由于回文串长度的奇偶性造成了不同性质的对称轴位置,解法2要对两种情况 ...
- 51nod 1089 最长回文子串 V2(Manacher算法)
回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串. 输入一个字符串Str,输出Str里最长回文子串的长度. 收起 输入 输入Str(Str的长度 <= 100000) ...
- 51nod1089(最长回文子串之manacher算法)
题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1089 题意:中文题诶~ 思路: 我前面做的那道回文子串的题 ...
随机推荐
- 【新技术】Docker 学习笔记
原文地址 一.Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享.管理 Docker 容器的 Docker SaaS 平台 -- ...
- C#浅析单例模式
第一次写博客,写的不好休怪哈. 版本1:最简单的单例模式 方法一: public class MySingleton { private MySingleton() //构造函数,注意private ...
- Oracle常用SQL查询(2)
三.查看数据库的SQL 1 .查看表空间的名称及大小 select t.tablespace_name, round ( sum (bytes / ( 1024 * 1024 )), 0 ) ts ...
- JavaScript异步编程(1)- ECMAScript 6的Promise对象
JavaScript的Callback机制深入人心.而ECMAScript的世界同样充斥的各种异步操作(异步IO.setTimeout等).异步和Callback的搭载很容易就衍生"回调金字 ...
- How to Operate SharePoint User Alerts with PowerShell
When you migrate list or site, the user alerts in the site will not be migrated together with the co ...
- Android Studio添加aar
1.把aar复制到项目中的 libs 里面 2.在module 里面的build.gradle 的根目录添加 repositories{ flatDir { dirs 'libs' } } 3.在mo ...
- Android 学习心得 TextView 添加垂直滚动条
XMl文件中: 添加android:scrollbars="vertical" 添加android:maxLines="10" //设置一页最多显示10行 a ...
- python之很好的网站
1.python官方开发者文档查询和python下载网站 2.
- ORACLE告警日志文件
告警日志介绍 告警日志文件是一类特殊的跟踪文件(trace file).告警日志文件命名一般为alert_<SID>.log,其中SID为ORACLE数据库实例名称.数据库告警日志是按时间 ...
- sublime3 集成angularJs插件
sublime是web开发中一款轻量级高效编辑器,十分适合前端开发(安装sublime是需要注册的,请支持正版) 1.安装sublime3(http://www.sublimetext.com/3) ...