Codeforces Round 934 (Div. 2) D

C o d e f o r c e s R o u n d 934 ( D i v . 2 ) \Huge{Codeforces Round 934 (Div. 2)} CodeforcesRound934(Div.2)

D . N o n − P a l i n d r o m i c S u b s t r i n g \large{D. Non-Palindromic Substring} D.NonPalindromicSubstring

文章目录

  • 题意
  • 思路
  • 标程

题意

给出一个字符串 s s s,然后给出若干次查询,每次查询是对 s s s的子段 s [ l , r ] s[l,r] s[l,r]进行判断,具体为:**对于子段$ s[l,r] 中长度为 中长度为 中长度为k 的子串,如果存在不是回文的子串,则将该长度 的子串,如果存在不是回文的子串,则将该长度 的子串,如果存在不是回文的子串,则将该长度k 加上 ∗ ∗ 。对于每次查询,输出子段 加上**。对于每次查询,输出子段 加上。对于每次查询,输出子段s[l,r]$的长度之和。

思路

这是一道考察 M a n a c h a r Manachar Manachar算法的好题。

让我们先来观察题目性质:

对于任意字符串 s s s,若其本身不是回文字符串,则其子串中必然包含长度从 2... s . s i z e ( ) 2...s.size() 2...s.size()非回文子串

证明如下:

若字符串s中存在任意一个长度为 k ( 2 ≤ k ≤ s . s i z e ( ) ) k(2\le k \le s.size()) k(2ks.size())的子字符串全都是回文字符串,则我们可以根据 k k k构造出 s s s,且 s s s为回文字符串。

根据上述证明,我们可以发现一个性质:

1. 当偶数长度的子串是回文时:

  • 如果其偶数子串全都是回文串,则如果第i位填了字符 c h ch ch,那么第 i + 1 i+1 i+1位也一定是 c h ch ch,因为长度为 2 2 2的字符串也要求回文。所以,当且仅当整个串全部相同时,才会全都是回文。

2. 当奇数长度的子串是回文时:

  • 对于奇数长度,整个串全部相同是一种情况。

  • 另一种情况是 a b a b a ababa ababa,即规定前两个字符,然后推导出后面的字符。这样奇数长度的子串全部为回文串。

需要注意的是,当其本身就是回文字符串时,不能加上本身长度。

然后跟据 M a n a c h a r Manachar Manachar算法,我们可以预处理字符串,然后每次可以 O ( 1 ) O(1) O(1)查询出当前子串是否为回文子串。

标程

#include<bits/stdc++.h>

using namespace std;

#define IOS ios::sync_with_stdio(false); cin.tie(nullptr), cout.tie(nullptr);
#define int long long 
#define ULL unsigned long long 
#define PII pair<int, int>
#define lowbit(x) (x & -x)
#define Mid ((l + r) >> 1)
#define ALL(x) x.begin(), x.end()
#define endl '\n'
#define fi first 
#define se second

const int INF = 0x7fffffff;
const int Mod = 1e9 + 7;
const int N = 1e6 + 10; 

string add(string s) {
    string str;
    int len_s = s.size();
    if(len_s == 0) return "^@";

    str += '^';
    for (int i = 0; i < len_s; i++) {
        str += '#'; str += s[i];
    }
    str+="#@";
    return str;
}

string manacher_P(string s, vector<int> &P) {
    string str;
    str = add(s);

    int maxid = 0, mid = 0;
    //int l, r, sum;    //Manacher求所有回文子串
    int len_str = str.size();
    P.resize(len_str);
    for (int i = 1; i < len_str - 1; i++) {
        if(maxid > i) P[i] = min(P[2 * mid - i], maxid - i);//进行三种情况的判断
        else P[i] = 1;// 等于 R 的情况

        while (str[i + P[i]] == str[i - P[i]]) P[i]++;  //中心拓展
        
        if (i + P[i] > maxid) {//如果当前回文串已经覆盖到了原先没有覆盖到的地方,则更新标记
            maxid = i + P[i]; mid = i;
        }
        //Manacher求所有回文子串
        //l = (i - 1) / 2 - (P[i] - 1) / 2;
        //r = (i - 1) / 2 + (P[i] - 1) / 2;
        //if(P[i] & 1) r --;
        //sum += (r - l + 2) / 2;
    }
    //return sum;   //Manacher求所有回文子串个数
    
    int maxlen = 0, t = 0;
    for(int i = 1; i < len_str - 1; i ++ ) {
        if(P[i] > maxlen) {
            maxlen = P[i]; t = i;
        }
    }
    int st = (t - maxlen) >> 2;
    return s.substr(st, st + maxlen - 1);   //返回s中最长公共子串
}
void Solved() { 
    int n, q; cin >> n >> q;
    string s; cin >> s;
    vector<int> p, f1(n), f2(n);
    auto t = manacher_P(s, p);

    for(int i = n - 1; i >= 0; i -- ) {
        if(i + 1 < n && s[i + 1] == s[i]) f1[i] = f1[i + 1];
        else f1[i] = i + 1;
        if(i + 2 < n && s[i + 2] == s[i]) f2[i] = f2[i + 2];
        else f2[i] = i + 2;
    }

    while(q -- ) {
        int l, r; cin >> l >> r; l --;
        int len = r - l;
        int res = 0;
        if(f1[l] < r) {//不是全部相当
            int temp = (len - 1) - (len - 1) % 2;
            if(temp >= 2) res += (temp + 2) * ((temp - 2) / 2 + 1) / 2;
        }
        if(f2[l] < r || f2[l + 1] < r) {//非ababa型
            int temp = (len - 1) - len % 2;
            if(temp >= 3) res += (temp + 3) * ((temp - 3) / 2 + 1) / 2;
        }
        if(p[l + r + 1] < len) res += len;//当不是回文串时
        cout << res << endl;
    }
}

signed main(void) {
    IOS

    int ALL = 1; 
    cin >> ALL;
    while(ALL -- ) Solved();
    // cout << fixed;//强制以小数形式显示
    // cout << setprecision(n); //保留n位小数

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/579193.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

拉链法解决哈希冲突

1.基本思想: 相同散列地址的记录链成一单链表,m个散列地址就设m个单链表,然后用一个数组将m个单链表的表头指针存储起来,形成一个动态的结构. 例如:一组关键字为{19,14,23,1,68,20,84,27,55,11,10,79},散列函数为:Hash(key)key%13, 就会发现有些元素是同义词,比如14%131,1%131…

江开2024年春《计算机组成原理 060214》第4次计分作业参考答案

答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 单选题 1某计算机字长32位&#xff0c;其存储容量为4GB&am…

MySQL__锁

文章目录 &#x1f60a; 作者&#xff1a;Lion J &#x1f496; 主页&#xff1a; https://blog.csdn.net/weixin_69252724 &#x1f389; 主题&#xff1a; MySQL__锁&#xff09; ⏱️ 创作时间&#xff1a;2024年04月27日 ———————————————— 这里写目录…

Java高阶私房菜-JVM垃圾回收机制及算法原理探究

目录 垃圾回收机制 什么是垃圾回收机制 JVM的自动垃圾回收机制 垃圾回收机制的关键知识点 初步了解判断方法-引用计数法 GCRoot和可达性分析算法 什么是可达性分析算法 什么是GC Root 对象回收的关键知识点 标记对象可回收就一定会被回收吗&#xff1f; 可达性分析算…

阳光电源社招前程无忧智鼎题库及远程包过助攻需要重点考察什么?

阳光电源社招前程无忧智鼎题库及远程包过助攻需要重点考察什么&#xff1f; 结合长期服务大型国有企业校招工作的经验&#xff0c;我们总结出阳光电源社招笔试的典型模式&#xff1a;行政职业能力测试企业应知应会测试心理测评&#xff0c;综合考察候选人的政治素养、文化素养…

VC2022 + protobuf

google这是有私心啊&#xff0c;protobuf从某个版本开始&#xff0c;依赖了一个google自己推出的大型组件集&#xff0c;Abseil&#xff0c;有点类似于Boost了&#xff0c;业内用的人&#xff0c;从个人狭窄的圈子来说&#xff0c;应该是不多的&#xff0c;据说google的众贤用的…

【UnityRPG游戏制作】RPG项目的背包系统商城系统和BOSS大界面

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

【C++】简易二叉搜索树

目录 一、概念&#xff1a; 二、代码实现&#xff1a; 大致结构&#xff1a; 1、遍历&#xff1a; 2、insert 3、find 4、erase 三、总结&#xff1a; 一、概念&#xff1a; 二叉搜索树又称为二叉排序树&#xff0c;是一种具有特殊性质的二叉树&#xff0c;对于每一个节…

springboot+springsecurity+vue前后端分离权限管理系统

有任何问题联系本人QQ: 1205326040 1.介绍 优秀的权限管理系统&#xff0c;核心功能已经实现&#xff0c;采用springbootvue前后端分离开发&#xff0c;springsecurity实现权限控制&#xff0c;实现按钮级的权限管理&#xff0c;非常适合作为基础框架进行项目开发。 2.效果图…

ICP点云配准初探

ICP点云配准初探 1 简介2 常用的点云配准算法3 ICP&#xff08;Iterative Closest Point&#xff0c;最近点迭代法&#xff09;3.1 ICP要解决的问题3.2 ICP的核心思想3.3 算法流程3.4 总结 4 ICP优缺点 1 简介 在逆向工程&#xff0c;计算机视觉&#xff0c;文物数字化等领域中…

香港BTC、ETH现货ETF同时通过,对行业意义几何?

香港比美国更快一步通过以太坊现货 ETF。 2024 年 4 月 15 日&#xff0c;香港嘉实国际资产管理有限公司&#xff08;Harvest Global Investments&#xff09;今天宣布&#xff0c;得到香港证监会的原则上批准&#xff0c;将推出两大数字资产&#xff08;比特币及以太坊&#…

​可视化大屏C位图:园区鸟瞰

将园区鸟瞰图作为可视化大屏设计的焦点图有以下几个好处&#xff1a; 提供全局视图&#xff1a;园区鸟瞰图可以展示整个园区的布局和结构&#xff0c;提供全局视图。这对于大型园区或复杂的场所来说尤为重要&#xff0c;用户可以一目了然地了解整个园区的规模、分布和关联关系…

go设计模式之工厂方法模式

工厂方法模式 什么是工厂方法模式 工厂方法模式是一种创建型设计模式&#xff0c;它定义了一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。工厂方法使一个类的实例化推迟到其子类。 这个接口就是工厂接口&#xff0c;子类就是具体工厂类&#xff0c;而需要创…

频率分析和离散傅里叶变换——DSP学习笔记四

背景知识 四种基本的傅里叶变换 基本思想&#xff1a;将信号表示为不同频率 正弦分量的线性组合 正弦信号和复指数时间信号的有用特性 相同频率但不同相位的正弦信号的任何线性组合&#xff0c;都是有着相同频率但不同相位&#xff0c;且幅度可能受改变的正弦信号。 复指数时…

EXCEL表格中的数字,为什么每次打开会自动变成日期?

一、典型现象 在工作中&#xff0c;有时会发现公司里的报表&#xff0c;经过多人多次的重复的使用和修改后&#xff0c;会出现这种情况&#xff1a; 1.在表格里按照需要输入数字&#xff0c;保存工作簿。 2.然而&#xff0c;再次打开工作簿&#xff0c;里面的数字变成日期&a…

Linux多线程(二) 线程同步 信号量互斥锁读写锁条件变量

多个进程同时访问某些资源时&#xff0c;必须考虑同步问题&#xff0c;以确保任一时刻只有一个进程可以拥有对资源的独占式访问。通常&#xff0c;程序对关键资源的访问代码只是很短的一段&#xff0c;我们称这段代码为关键代码段或者临界区&#xff0c;对进程同步&#xff0c;…

火绒安全概述

页面简介&#xff1a; 火绒安全是一款集多种安全功能于一体的国产软件&#xff0c;旨在为用户提供全面的计算机保护。本页面将详细介绍火绒安全的核心功能和使用方式。 页面内容概览&#xff1a; 杀毒防护 实时监控&#xff1a;详细介绍火绒安全如何实时检测系统中的文件和程序…

【强训笔记】day5

NO.1 思路&#xff1a;找到数量最小的字符&#xff0c;就可以知道you的数量&#xff0c;用o的数量减去you的数量再减去1就是oo的数量。 代码实现&#xff1a; #include<iostream>using namespace std;int main() {int q;cin >> q;int a, b, c;while (q--){cin &g…

Java web应用性能分析之【sysbench基准测试】

Java web应用性能分析之【CPU飙高分析之MySQL】-CSDN博客 Java web应用性能分析之【Linux服务器性能监控分析概叙】-CSDN博客 Java web应用性能分析概叙-CSDN博客 Java web应用性能分析之【基准测试】-CSDN博客 上面基本科普了一下基准测试&#xff0c;这里我们将从sysbench…

雷电模拟器,安卓手机模拟器电脑端去广告精简优化版 v9.0.70 (240427)

软件介绍 在众多安卓模拟器中&#xff0c;雷电模拟器作为电脑端手游的首选平台&#xff0c;由上海畅指网络科技有限公司研发并免费提供给用户。此模拟器搭载了先进的内核技术&#xff08;基于版本&#xff09;&#xff0c;确保了软件运行的高速性和稳定性。雷电模拟器还引入了…
最新文章