博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51Nod 1089 最长回文子串 V2 —— Manacher算法
阅读量:4597 次
发布时间:2019-06-09

本文共 1307 字,大约阅读时间需要 4 分钟。

题目链接:

 

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 
 
回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。
输入一个字符串Str,输出Str里最长回文子串的长度。
 
Input
输入Str(Str的长度 <= 100000)
Output
输出最长回文子串的长度L。
Input示例
daabaac
Output示例
5

 

题解:

普通的方法是枚举中心,然后向两边扩展。时间复杂度为O(n^2),而这里的数据量:len<=1e5,所以会超时。

Manacher算法:O(n)求出最长回文子串。(为什么是线性复杂度?自己也不太清楚,应该是mx为线性增长。)

(注:在首端加‘$’是防止在向左右扩散时在左端溢出(右端已经有‘\0’,故无需再设一个‘$’)。)

代码如下:

1 #include
2 using namespace std; 3 typedef long long LL; 4 const double eps = 1e-6; 5 const int INF = 2e9; 6 const LL LNF = 9e18; 7 const int mod = 1e9+7; 8 const int maxn = 1e5+10; 9 10 char s[maxn], Ma[maxn<<1];11 int Mp[maxn<<1];12 13 int Manacher(char *s, int len)14 {15 int ret = 0;16 int l = 0;17 //开头加个特殊符号,以防止下标溢出( while(Ma[i+Mp[i]]==Ma[i-Mp[i]]) Mp[i]++;)18 //由于结尾有'\0',所以无需再添加19 Ma[l++] = '$'; Ma[l++] = '#';20 for(int i = 0; i
=i?min(Mp[2*id-i], mx-i):0; //如果能覆盖到i,则得到以i为中心,最小的回文度;否则从0开始33 while(Ma[i-Mp[i]-1]==Ma[i+Mp[i]+1]) Mp[i]++; //往两边扩展34 if(i+Mp[i]>mx) //更新mx和id35 {36 mx = i+Mp[i];37 id = i;38 }39 ret = max(ret,Mp[i]);40 }41 return ret;42 }43 44 int main()45 {46 cin>>s;47 cout<< Manacher(s, strlen(s)) <
View Code

 

转载于:https://www.cnblogs.com/DOLFAMINGO/p/7538622.html

你可能感兴趣的文章
使用appledoc
查看>>
转:Loadrunner添加服务器监控
查看>>
remove debug symbols to a seperate file
查看>>
ArcGIS ArcMap “ Add Data” 打开后,一直卡死,无内容
查看>>
在C#中使用属性控件添加属性窗口
查看>>
Java 消息队列-Java并发编程 阻塞队列
查看>>
Web Service简介
查看>>
Java 内存模型- Java Memory Model
查看>>
同步锁Lock
查看>>
Spark RDD的设计与运行原理
查看>>
缺少libz.so
查看>>
jquery 的一些基本操作
查看>>
Nginx 的 docker 部署
查看>>
Linux 下应用程序最大打开文件数的理解和修改【转】
查看>>
[HNOI2018]毒瘤
查看>>
第一次WM_PAINT事件执行前显示白色框 的解决办法
查看>>
快速备份和还原 MySQL 数据库的另一种方法
查看>>
Java读取其他jar包里的配置文件
查看>>
javascript好文分享
查看>>
python-day54--前端之js-DOM对象
查看>>