首页 > 其他分享 >Template <Manacher>

Template <Manacher>

时间:2023-07-27 19:34:40浏览次数:30  
标签:Template int maxr ms 半径 include 回文

#include <iostream>
#include <string>
#include <vector>
using namespace std;

// O(n) 计算字符串s的每个字符的最大回文半径,返回最长回文子串长度
int Manacher(string s)
{
	// 空字符串直接返回0
    if (s.length() == 0) return 0;

	// manacher 扩展后串长度
    int len = (int)(s.length() * 2 + 1); 
	// 扩展后manacher字符串 (下标从1开始)
	string ms = "$#";
	for (auto ch: s) 
	{
		ms += ch; 
		ms += '#'; 
	} 
	// maxr[i] 表示以ms[i]为回文字串的对称中心,最大回文半径
	// 如 aabaa 的回文中心为 b, 回文半径 maxr = 3
	vector<int> maxr(len+1, 0);
    // 当前最右侧回文子串下标r, 该串的回文中心c, 当前最大回文半径 maxl
	int r = -1, c = -1, maxl = 0;
	for (int i = 1; i <= len; i ++)
	{
		if (i <= r) maxr[i] = min(r - i + 1, maxr[c * 2 - i]);  // 当i不超过当前最右侧回文边界,则可对称O(1)得到答案
		else maxr[i] = 1;  	// 若超过当前最右侧边界,则需要暴力比较,回文半径初始为1,即一个字符
		while (i - maxr[i] >= 1 and i + maxr[i] <= len and ms[i-maxr[i]] == ms[i+maxr[i]])  // 不越界,两侧字符相同
			maxr[i] ++;  	// 回文半径+1
		maxl = max(maxl, maxr[i]);  // 更新最大回文半径
		if (i + maxr[i] - 1 > r)  	// 更新最右侧边界
		{
			r = i + maxr[i] - 1;
			c = i;
		}
	}
	int res = maxl - 1;  // 原串s的最大回文子串长度=扩展串ms的最大回文半径-1
	return res;
}

int main()
{
    int T = 1; cin >> T;
    while (T --)
    {
        string s; cin >> s;
        cout << Manacher(s) << endl;
    }
    return 0;
}

标签:Template,int,maxr,ms,半径,include,回文
From: https://www.cnblogs.com/o2iginal/p/17585845.html

相关文章

  • String mobleCode = redisTemplate.opsForValue().get(phone);
    使用RedisTemplate获取手机验证码在现代的应用程序中,手机验证码被广泛用于用户身份验证和安全验证。使用手机验证码可以确保用户提供的手机号是有效的,并且可以防止恶意行为。在本文中,我们将介绍如何使用SpringDataRedis中的RedisTemplate来获取手机验证码。RedisTemplate简介R......
  • 在langchain中使用带简短知识内容的prompt template
    简介langchain中有个比较有意思的prompttemplate叫做FewShotPromptTemplate。他是这句话的简写:"Prompttemplatethatcontainsfewshotexamples."什么意思呢?就是说在Prompttemplate带了几个比较简单的例子。然后把这些例子发送给LLM,作为简单的上下文环境,从而为LLM提供额外......
  • cookie+session(这里使用redistemplate代替)实现单点登录流程
     user发起资源请求(带上回调的路径方便回调),通过判断是否浏览器的cookie中是否存在登录过的痕迹,比如有人登了,然后存了一个cookie到浏览器如果拿到了cookie是有东西的,则带上这个cookie的内容返回给client,如果没有东西,则继续登录,向session中存入userInfo,并给浏览器设置cookie......
  • 封装RedisTemplate工具类
    packagecom.juxi.common.redis.service;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.redis.core.*;importorg.springframework.stereotype.Component;importjava.time.Duration;importjava.util.*;importja......
  • modulo template
    #include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;template<classT>constexprTpower(Ta,i64b){  Tres=1;  for(;b;b/=2,a*=a){    if(b%2){      res*=a;    }  }  returnr......
  • vSphere通 python vmtemplate
    vSphere通pythonvmtemplate介绍vSphere是一款由VMware开发的虚拟化平台,可用于创建和管理虚拟机。借助vSphereAPI,我们可以使用Python编写脚本来与vSphere进行交互。本文将介绍如何使用Python及其相关库来管理vSphere中的虚拟机模板。准备工作要开始使用Python与vSphere进行交......
  • RedisTemplate 泛型不同 指向的是同一个实例吗
    RedisTemplate泛型不同指向的是同一个实例吗在使用RedisTemplate时,我们经常会遇到需要指定不同数据类型的情况。比如,我们可能需要将某个对象存储到Redis中,并且需要使用不同的数据类型进行序列化和反序列化。那么,RedisTemplate在这种情况下会创建多个实例吗?本文将解答这个问......
  • 记jdbcTemplate使用的一个坑
    1、在使用jdbcTemplate时,语句不能使用select* ,不然可能就是这样的错误:Incorrectcolumncount:expected1,actual62、如果像这样的外层嵌套,应该去掉外层select*,语句:select*from(selectmater_score.mater_noasmaterNo,city,town,mater_score.avgasavgScor......
  • jdbc-plus是一款基于JdbcTemplate增强工具包,基于JdbcTemplate已实现分页、多租户、动
    ......
  • 再见RestTemplate,Spring 6.1新特性:RestClient 了解一下!
    在最近发布的Spring6.1M2版本中,推出了一个全新的同步HTTP客户端:RestClient。用一句话来让Spring开发者认识RestClient的话:像WebClient一样具备流畅API的RestTemplate。所以,RestClient的使命就是淘汰已经有14年历史的RestTemplate。关于WebClient和RestTemplate,之前在几种服务消......