首页 > 编程语言 >Manacher 算法

Manacher 算法

时间:2024-03-26 10:11:07浏览次数:13  
标签:string int Manacher rMax 算法 ans size

开个坑,后续补解析

class Solution {
public:
    int countSubstrings(string s) {
        int n = s.size();
        string t = "$#";
        for (const char &c: s) {
            t += c;
            t += '#';
        }
        n = t.size();
        t += '!';

        auto f = vector <int> (n);
        int iMax = 0, rMax = 0, ans = 0;
        for (int i = 1; i < n; ++i) {
            // 初始化 f[i]
            f[i] = (i <= rMax) ? min(rMax - i + 1, f[2 * iMax - i]) : 1;
            // 中心拓展
            while (t[i + f[i]] == t[i - f[i]]) ++f[i];
            // 动态维护 iMax 和 rMax
            if (i + f[i] - 1 > rMax) {
                iMax = i;
                rMax = i + f[i] - 1;
            }
            // 统计答案, 当前贡献为 (f[i] - 1) / 2 上取整
            ans += (f[i] / 2);
        }

        return ans;
    }
};

 

标签:string,int,Manacher,rMax,算法,ans,size
From: https://www.cnblogs.com/Kellen-Gram/p/18095979

相关文章

  • 嵌入式算法开发系列之pid算法
    文章目录概要一、PID算法原理二、PID算法模型三、PID算法实现方法四、PID算法C语言实现示例五、PID算法在嵌入式系统中的应用小结概要PID(Proportional-Integral-Derivative)控制算法是一种常用的闭环控制算法,广泛应用于嵌入式系统中的控制器设计。今天张工将深入探讨......
  • 编辑距离算法
    1.题目给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数  。你可以对一个单词进行如下三种操作:删除一个字符替换一个字符插入一个字符示例:输入:word1="horse",word2="ros"输出:3解释:horse->rorse(将'h'替换为'r')ror......
  • Python数据结构实验 递归算法设计
    一、实验目的1.掌握递归程序设计的基本原理和方法;2.熟悉数据结构中顺序表和单链表下的递归算法设计思想;3.掌握并灵活运用递归算法解决一些较复杂的应用问题。二、实验环境1.Windows操作系统的计算机2.Python3.7环境平台和PyCharm编辑器三、实验说明 1.实现递归算法的程序......
  • 算法训练day50卡玛70. 爬楼梯(进阶版)Leetcode322. 零钱兑换279. 完全平方数
    57.爬楼梯(第八期模拟笔试)题目分析我们可以使用动态规划。动态规划的思想是用一个数组dp来保存到达每一级台阶的方法数。对于每一级台阶i,你可以从i-1,i-2,...,i-m级台阶爬上来(只要这些台阶的索引大于等于0),因此到达第i级台阶的方法数就是这些dp[j](i-m<=j<i)的总和。acm......
  • 最小生成树:Kruskal算法和Prim算法
    首先区别一下图跟树:树不会包含环,图可以包含环。图的生成树其实就是在图中找一棵包含图中的所有节点的树。专业点说,生成树是含有图中所有顶点的无环连通子图。最小生成树就是再所有可能的生成树中,权重和最小的那棵生成树就叫最小生成树(注意:最小生成树有n-1条边)。Kruskal算法......
  • 蓝桥杯算法基础(29)字符串匹配(RabinKarp)(KMP)(前缀树,字典树,trie,后缀数组,高度数组)
     RabinKarpRabinKarpS:ABABABm个P:ABBn个1.朴素算法,挨个匹配2.哈希法hash->滚动哈希c0*31^2+c1*31^1+c2类似于进制的求法求hash值(c0*31+c1)*31+c2hash(p)=o(n)hash(s)=o(m*n)privatestaticvoidmatch(Stringp,Strings){longhash_p=hash(p);......
  • 加密算法概述:分类与常见算法
    码到三十五:个人主页心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得!在信息安全领域,加密技术是保护数据不被未授权访问的关键手段。Java作为一种广泛使用的编程语言,提供了丰富的加密API,支持多种加密算法。本文将介绍Java中加密算法的分类以及常见的......
  • 蓝桥杯算法集训 - Week 4:BFS、并查集、Flood Fill、哈希、单调栈/队列
    蓝桥杯算法集训-Week4本系列随笔用于整理AcWing题单——《蓝桥杯集训·每日一题2024》的系列题型及其对应的算法模板。一、BFSBFS算法复习参考:BFS(Java)广度优先搜索简单介绍、模板、案例(一)Ⅰ、代码模板staticvoidbfs(Troot){//双端队列,用来存储元素D......
  • 6种负载均衡算法
    6种负载均衡算法1、轮询法此算法将请求按顺序轮流的分配到后端服务器,他均衡的对待后台每一台服务器,而不关心服务器实际的连接数和当前的系统负载publicclassRoundRobin{privatestaticMap<String,Integer>serverWeightMap=newHashMap<String,Integer>();......
  • Java实现轮询调度算法(Round Robin)
    Java实现轮询调度算法(RoundRobin)Java实现轮询调度算法(RoundRobin)引言在计算机科学中,轮询调度算法(RoundRobin)是一种常见的任务调度算法。它被广泛应用于操作系统、网络路由器、负载均衡器等领域。本文将介绍轮询调度算法的原理、实现以及在Java中的应用。轮询调度算法原理......