首页 > 编程语言 >manacher 回文串处理算法

manacher 回文串处理算法

时间:2023-10-07 09:56:59浏览次数:46  
标签:int manacher 算法 ans 回文 getchar

忘了具体什么时候写的,应该是 2023.8 初

这算是个算法复习,因为我太菜了以前学的都不会了。

manacher 回文串处理算法

其实这个我已经看两天了却一直没有看懂,觉得自己很愚笨,结果发现是自己一直不想去理解吧,然后今天仔细研究了以后发现就是那么个东西,没有什么很深奥的东西,那就自己整理一下思路吧。

manacher 算法的本质其实也是历史信息运用吧,我们观察到回文串都有个中心,奇数和偶数不一样,不过我们可以直接在每个字符之间加一个无用字符让它们都变成相对好处理的奇回文串。

  • 如果一个串是回文串并且被另外一个回文串包含,那么它对称过去的串也是回文串。
    基本思路就是这个,但是这个算出来的回文串不一定最大,所以我们只需要暴力扩张即可。

均摊复杂度线性,我不会证明,但是看上去就挺线性的()。

乱搞即可:

\(Code\)

int n,a[25000007],w[25000007],ans;//w表示回文半径(包括自己)
int main(){
    for(char c=getchar();c!=EOF;c=getchar())
        a[(n+=2)]=c-'a'+1;
    n++;a[0]=-1;//懒得特判了,让0不一样即可。
    for(int i=1,r=-1,mid=-1;i<=n;i++){
        if(i<=r)w[i]=min(w[(mid<<1)-i],r-i+1);
        while(a[i-w[i]]==a[i+w[i]])w[i]++;
        if(i+w[i]>r)r=i+w[i]-1,mid=i;
        // 因为包括了自己,所以要多减一个1
        if(w[i]>ans)ans=w[i];
    }
    cout<<ans-1;//半径就是答案,但是因为包括了自己,所以要减一
}

标签:int,manacher,算法,ans,回文,getchar
From: https://www.cnblogs.com/NBest/p/17745590.html

相关文章

  • 10 对比不同的优化算法
    importnumpyasnpimportmatplotlib.pyplotaspltimportscipy.ioimportmathimportsklearnimportsklearn.datasetsfromopt_utilsimportload_params_and_grads,initialize_parameters,forward_propagation,backward_propagationfromopt_utilsimportcomp......
  • 【算法】国庆加班,火锅与Linq.AddRange的奇妙螺旋
    在国庆假期的一个傍晚,小悦正在家中享受火锅美食。她嘴里咀嚼着鲜嫩的牛肉,脸上洋溢着满足的微笑。突然,手机铃声响起,打破了这温馨的氛围。她拿起手机一看,是公司打来的电话。“小悦,有个紧急的项目需要处理,你能来公司加一下班吗?”电话那头传来领导焦急的声音。小悦顿时嘟起嘴,不太情......
  • 扩展欧几里得算法
    算法阅读此篇前可先阅读欧几里得算法。给定\(a,b,s\),求\(ax+by=s\)的任意一组解。证明:由裴蜀定理得:二元一次方程\(ax+by=c\)的有解条件是\(\gcd(a,b)\midc\)。由欧几里得算法得知\(\gcd(a,b)=\gcd(b,a\modb)\)假设我们求出了\(\gcd(b,a\modb)\)的两个解\((x'......
  • 算法性能分析
       1.究竟什么是时间复杂度时间复杂度是一个函数,它定性描述该算法的运行时间。假设算法的问题规模为n,那么操作单元数量便用函数f(n)来表示,随着数据规模n的增大,算法执行时间的增长率和f(n)的增长率相同,这称作为算法的渐近时间复杂度,简称时间复杂度,记为O(f(n))2.什么是大O......
  • 文心一言 VS 讯飞星火 VS chatgpt (107)-- 算法导论10.1 5题
    五、用go语言,栈插入和删除元素只能在同一端进行,队列的插入操作和删除操作分别在两端进行,与它们不同的,有一种双端队列(deque),其插入和删除操作都可以在两端进行。写出4个时间均为O(1)的过程,分别实现在双端队列的两端插入和删除元素的操作,该队列是用一个数组实现的。文心一言:在G......
  • 文心一言 VS 讯飞星火 VS chatgpt (107)-- 算法导论10.1 5题
    五、用go语言,栈插入和删除元素只能在同一端进行,队列的插入操作和删除操作分别在两端进行,与它们不同的,有一种双端队列(deque),其插入和删除操作都可以在两端进行。写出4个时间均为O(1)的过程,分别实现在双端队列的两端插入和删除元素的操作,该队列是用一个数组实现的。文心一言:在Go......
  • 算法异或的运用
    题目描述在一条无限长的路上,有一排无限长的路灯,编号为1,2,3,4,…。每一盏灯只有两种可能的状态,开或者关。如果按一下某一盏灯的开关,那么这盏灯的状态将发生改变。如果原来是开,将变成关。如果原来是关,将变成开。在刚开始的时候,所有的灯都是关的。小明每次可以进行如下的操作:指......
  • 算法之动态规划(DP)求解完全背包问题(状态转移式方程推导)
    完全背包是01背包的进阶版。在这里补充一下代码随想录的完全背包状态转移式的推导。有兴趣的可以先看一看原版。状态转移方程状态:dp[i][j]选择前i个物品,容量为j的背包时所选物品价值总和最大。状态转移:dp[i][j]=max(dp[i-1][j-k*v[i]]+k*w[i])(k=0,1,2,3...)(j-k*v......
  • 深入探究数据结构与算法:构建强大编程基础
    文章目录1.为什么学习数据结构与算法?1.1提高编程技能1.2解决复杂问题1.3面试准备1.4提高代码效率2.学习资源2.1经典教材2.2在线学习平台2.3学习编程社区3.数据结构与算法的实际应用3.1排序算法3.2图算法3.3字符串匹配算法4.结论......
  • 基础算法--字符串
    \(KMP\)\(KMP\)算法(Knuth-Morris-Pratt算法)是一个著名的字符串匹配算法,效率很高,但是确实有点复杂。基本概念\(1\)、s[]是模式串,即比较长的字符串。\(2\)、p[]是模板串,即比较短的字符串。(这样可能不严谨。。。)\(3\)、“非平凡前缀”:指除了最后一个字符以外,一个字符串的全......