左(7)--kmp,manacher,morris

前言

仅记录学习笔记,如有错误欢迎指正。

题目:

在这里插入图片描述
思路:实现1个函数infect(),把1连接的位置都变为2,此时算一个岛。
在这里插入图片描述
在这里插入图片描述

如何设计一个并行算法解决这个问题?

在多个cpu中 每次存入分界线的信息,如果每次分界的位置可以和另外的边界凑成一个,每个cpu的岛size–;

并查集的概念:

1.提供一个isSameSet(a,b) —判断两个集合是否在同一个集合,找他们的父节点
2.提供一个union(a,b)— 把a,b集合合并,size小的集合挂在size大的集合下,size相加
3.findHead(v)—做了优化,找到该节点的父节点后,把其他节点都直接指向父节点(扁平化,方便下次查询–o(1))
当findHead调用次数接近n或者超过n,复杂度就是0(1)
类似于图的结构,

在这里插入图片描述
在这里插入图片描述

KMP:

next数组表示为:在i位置之前,前缀和后缀相等的最长的长度。
时间复杂度O(N)
在这里插入图片描述
在这里插入图片描述

Manacher算法:

返回最长回文子串

思路:

r指的是回文的最大右边界位置
i是当前字符所在位置
pArr表示i位置的回文半径的数据
情况1:i > r 超出最大右边界,r++,i++;
情况2:i < r
2.1:i在r内 pArr = i的回文半径
2.2:i在r外 pArr = r-i
2.3:i在r边界 pArr = r-i

预处理:
在这里插入图片描述

for里面第一行代码指的是:
所有情况里最小不用验证的区域;i>r 本身就是回文;i<R,要么是r-i,要么是i‘的位置
while循环指的是:在不用验证的区域外,所有情况都试着往外扩,为了代码简洁。
返回max-1是因为 有’#'预处理

在这里插入图片描述

morris遍历:
感觉用不上啊。。
可见:
https://blog.csdn.net/Borslav/article/details/125680121

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值