马拉车(Manacher)

马拉车算法(Manacher)是一种常见的字符串算法。下面我就来讲一讲。

1.简介

Manacher算法是一种快速判断字符串最长回文长度的一种字符串算法,分为三个步骤:预处理、加速盒子和主算法

2.代码

1.预处理

string b = "@";
char a[200005];
int n, r, m, ans, d[200005];

void pre(){
	for (ll i = 0; i < n; i++){
    	b += '#';
        b += a[i];
    }
    
    b+='#';
    //如果字符串是"asda",那么处理后的字符串就是"@#a#s#d#a#",为以后的算法做准备。
}

2.加速盒子(提示:这是以中间m长度为基准,还有一种方法是以右侧为基准,欢迎大家在评论区写出另一种的加速盒子)

void fast_box(int pos){
	//重点:利用以前的回文长度和自己的回文长度比较,比谁小
	d[pos] = min(d[2*m-pos], r-pos+1);
}

3.主算法

void Manacher(){
	for (int i = 1; i < b.size(); i++){
    	if (i <= r) fast_box(i);
    }
        
    //暴力枚举
    while (b[i - d[i]] == b[i + d[i]]) d[i]++;
    
    //更新答案
    if (i + d[i] >= r){
    	m = i;
    	r = i + d[i] - 1;
    	ans = max(ans, d[i]-1);
    }
    
    cout << ans << endl;
}

这就是Manacher的全部了,点个赞再走呗。在main函数直接调用pre()函数和Manacher()函数就行。欢迎在评论区留言!

c++算法大全 文章被收录于专栏

本专栏收集了c++大部分基础算法,附有简介和代码。

全部评论

相关推荐

码客明:我们组100%
投递美团等公司10个岗位
点赞 评论 收藏
分享
7.29投递&nbsp;-&gt;&nbsp;8.8&nbsp;AI面&nbsp;-&gt;&nbsp;两次笔试(最高1.067/3)&nbsp;-&gt;&nbsp;8.25一面挂&nbsp;-&gt;&nbsp;8.27复活赛一面8.25一面:1、实习拷打;2、spring&nbsp;IOC的理解,依赖注入时,@Autowired和Resource区别;3、mq提问:消息堆积可能诱因和应对措施,生产者生产信息出现大量重试或者生产大量异常信息怎么治理,怎么保证消费的顺序性和不丢,死信队列一般是用来做什么的;4、redis提问:zset的应用场景的底层实现,String的底层实现,跳表为什么快,redis还有什么数据结构有什么应用,如果把大key(String)拆成几个小key(Zset等等),会不会在获取过程中有分布式事务问题;5、mysql提问:B+树结构,聚簇索引,(a,b,c)联合索引时select&nbsp;*&nbsp;from&nbsp;table&nbsp;where&nbsp;a&nbsp;=&nbsp;x&nbsp;and&nbsp;c&nbsp;=&nbsp;x&nbsp;order&nbsp;by&nbsp;b怎么走索引,mysql执行一条sql的流程,sql语句执行顺序,怎么强制sql语句走某个索引,为什么会出现不走我们想要的A索引树而走B索引树的问题;6、你用过什么设计模式,AOP的代理模式和装饰器模式有什么异同;7、RPC提问:RPC和Http的区别,怎么做压缩的,为什么企业会选用RPC;8、对于时间环的理解;9、对AI工具的看法,之后根据AI面结果简单问了几个问题。算法题:输出一个数组内最小的K个数字估计一面挂咯,等复活,挂的原因:八股都是比较常规,但是算法没写出来。这是一个很简单的算法,但是我怕直接优先级队列会被挂,自己手写的快排,结果快排把基准值比较从数组数值比较写成数组下标比较了,写错两行看半天没看出来,给面试官都看尴尬了。事后面试官问我,我其实不想让你用这种方法的,实际业务的话你会用什么样的api呢,我说我打算直接优先级队列的,毕竟算是topK问题,堆排序更好更方便,但是怕太简单被挂。这下好了,想炫技一紧张快排写错了,结果都没出来。谁懂面试时候半天看不出来,面试结束一打开力扣发现基准值int&nbsp;pv&nbsp;=&nbsp;nums[left];&nbsp;&nbsp;写成&nbsp;int&nbsp;pv&nbsp;=&nbsp;left;&nbsp;&nbsp;的救赎感/**8.26更新,流转到其他组开始新初试了*/8.27&nbsp;复活赛一面:
查看10道真题和解析
点赞 评论 收藏
分享
评论
2
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务