题解:瑞学堂 瑞瑞的字符统计
本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。欢迎大家订阅我的专栏算法题解C与Python实现附上汇总贴算法竞赛备考冲刺必刷题C | 汇总【题目来源】瑞学堂瑞瑞的字符统计【题目描述】瑞瑞得到了一串由小写字母组成的字符串S SS。他想统计这个字符串中所有回文子串中每个字母出现的总次数。回文串是指正读和反读都一样的字符串。单个字符被视为回文串。例如字符串aba的回文子串有a位置1b位置2a位置3aba整个串。其中字母a出现了4 44次字母b出现了2 22次。由于结果可能很大请输出每个字母出现次数对10 9 7 10^971097取模后的结果。请你帮助瑞瑞编写程序完成这个任务。【输入】输入一行一个字符串S SS仅由小写字母组成。【输出】输出26 2626个整数用空格分隔依次表示字母a到z在所有回文子串中出现的总次数对10 9 7 10^971097取模的结果。【输入样例】aba【输出样例】4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0【核心思想】问题分析给定字符串S SS求所有回文子串中每个字母出现的总次数对10 9 7 10^971097取模。这是一个Manacher 差分数组问题关键在于先用 Manacher 求出以每个位置为中心的回文半径再用差分技巧统计每个位置被多少个回文子串覆盖最后累加各字母的贡献。算法选择Manacher 算法求出以处理后字符串每个位置i ii为中心的最长回文半径d [ i ] d[i]d[i]差分数组二阶差分每个中心i ii的回文串对区间[ i − d [ i ] 1 , i d [ i ] − 1 ] [i-d[i]1, id[i]-1][i−d[i]1,id[i]−1]产生中间高两边低的三角形贡献用二阶差分将O ( n 2 ) O(n^2)O(n2)的区间覆盖优化为O ( n ) O(n)O(n)前缀和还原两次前缀和将差分数组还原为每个位置的实际覆盖次数关键步骤Manacher 预处理插入#统一奇偶回文计算d [ i ] d[i]d[i]二阶差分标记遍历每个中心i ii回文覆盖范围[ l , r ] [ i − d [ i ] 1 , i d [ i ] − 1 ] [l, r] [i-d[i]1, id[i]-1][l,r][i−d[i]1,id[i]−1]coeff[l] 1coeff[i1] - 2coeff[r2] 1两次前缀和还原覆盖次数cur coeff[i]一阶前缀和sum cur二阶前缀和cnt[i] sum统计字母贡献遍历处理后字符串对实际字符位置i ii非#非$ans[s[i]-a] cnt[i]去重修正每个回文子串被计算了两次奇数中心和偶数中心最终答案乘2 22的逆元( M O D 1 ) / 2 (MOD1)/2(MOD1)/2时间/空间复杂度时间复杂度O ( n ) O(n)O(n)ManacherO ( n ) O(n)O(n)差分标记和前缀和O ( n ) O(n)O(n)空间复杂度O ( n ) O(n)O(n)处理后字符串、d dd数组、差分数组等Manacher 差分的核心思想回文覆盖的三角形分布以i ii为中心、半径为R RR的回文串位置j jj被覆盖当且仅当∣ j − i ∣ R |j-i| R∣j−i∣R覆盖次数随距离中心增加而递减形成三角形贡献二阶差分转常数操作三角形数列的二阶差分为常数通过1, -2, 1的标记将O ( n 2 ) O(n^2)O(n2)的逐点覆盖降为O ( 1 ) O(1)O(1)的区间标记对称性去重插入#后每个实际回文子串既对应某个原字符中心奇数长度也对应某个#中心偶数长度总贡献被计算两次需除以2 22模运算技巧用乘法逆元代替除法避免浮点精度问题适用于统计所有回文子串中各位置/字符贡献的问题核心在于将回文结构转化为区间覆盖再用差分优化统计【算法标签】#Manacher【代码详解】#includebits/stdc.husingnamespacestd;#defineintlonglong// 将int定义为long long避免中间计算溢出constintN100005*3,MOD1e97;// N为处理后字符串最大长度MOD为模数chara[N],s[N];// a存储原始字符串s存储处理后的字符串插入分隔符#intd[N];// d[i]为Manacher算法中以i为中心的最长回文半径intcoeff[N];// coeff用于差分数组记录每个位置作为回文中心次数的贡献intcnt[N],ans[26];// cnt[i]为位置i在所有回文子串中被覆盖的总次数ans[26]记录26个字母的出现次数// Manacher算法核心函数计算以每个位置为中心的最长回文半径voidget_d(char*s,intn){d[1]1;// 初始化以第一个字符为中心的回文半径为1// i遍历每个中心位置l和r维护当前最右回文串的左右边界for(inti2,l,r1;in;i){// 如果当前位置i在当前最右回文串[r]的范围内利用对称性初始化d[i]if(ir)d[i]min(d[r-il],r-i1);// 中心扩展尝试向两边扩展回文串while(s[i-d[i]]s[id[i]])d[i];// 更新最右回文串边界if(id[i]-1r)li-d[i]1,rid[i]-1;}}signedmain()// 使用signed main配合#define int long long{scanf(%s,a1);// 读入原始字符串intnstrlen(a1),k0;// n为原始字符串长度// 预处理在原始字符串的每两个字符之间以及首尾插入分隔符#s[0]$;// s[0]放哨兵字符$防止越界s[k]#;// 第一个字符为#for(inti1;in;i){s[k]a[i];// 放入原始字符s[k]#;// 在每个字符后插入#}nk;// 更新n为处理后字符串的长度get_d(s,n);// 执行Manacher算法// 第一步利用差分数组统计每个位置被多少个回文子串覆盖for(inti1;in;i){intRd[i];// R为以i为中心的回文半径if(R1)continue;// 半径为1表示只有自身单个#无实际字符贡献// 回文串在处理后字符串中的覆盖范围intli-R1;// 左边界intriR-1;// 右边界// 差分标记以i为中心的回文串对区间[l,r]内每个位置的贡献// 使用二阶差分技巧将三角形贡献转化为常数差分coeff[l](coeff[l]1)%MOD;// 左端点一阶差分1// 顶点右侧一阶差分从1变-1净变化-2coeff[i1](coeff[i1]-2MOD)%MOD;// 右端点外一阶差分从-1变0coeff[r2](coeff[r2]1)%MOD;}// 第二步通过两次前缀和还原每个位置被覆盖的次数intcur0,sum0;for(inti1;in;i){cur(curcoeff[i])%MOD;// 一阶前缀和当前一阶差分值sum(sumcur)%MOD;// 二阶前缀和当前位置被覆盖的总次数cnt[i]sum;// 记录位置i被覆盖的次数}// 第三步统计每个实际字母的出现次数for(inti1;in;i){// 只统计实际字符位置非#且非$的位置即原始字符串的字符位置if(s[i]!#s[i]!$){ans[s[i]-a](ans[s[i]-a]cnt[i])%MOD;// 累加该位置被覆盖的次数}}// 第四步输出结果// 每个实际回文子串在Manacher中被计算了两次奇数中心和偶数中心各一次所以答案要除以2intINV2(MOD1LL)/2;// 2在模MOD下的逆元MOD为质数且MOD为奇数(MOD1)/2即为2的逆元for(inti0;i26;i){ans[i]ans[i]*INV2%MOD;// 除以2乘逆元coutans[i] ;// 输出26个字母的结果}coutendl;return0;}【运行结果】aba 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

相关新闻

TencentDB Agent Memory版本控制:如何管理记忆系统的迭代升级?

TencentDB Agent Memory版本控制:如何管理记忆系统的迭代升级?

TencentDB Agent Memory版本控制:如何管理记忆系统的迭代升级? 【免费下载链接】TencentDB-Agent-Memory TencentDB Agent Memory is a team-level memory hub for AI Agents — turning conversations, docs, and code into four reusable memory asset…

2026/10/19 18:32:10 阅读更多 →
CmzPrep_Rev2 | 免U盘重装!

CmzPrep_Rev2 | 免U盘重装!

链接: https://pan.baidu.com/s/1u6UVoiSMfqLDnPWHOH2XwA 提取码: 916wCmzPrep 是一款免费的 Windows 系统重装与部署工具,支持 WIM、ESD、ISO 等多种映像格式,兼容 Windows 7 至 11。它采用轻量 PE 环境,提供快速重装和保留数据功能&#xf…

2026/10/20 6:29:16 阅读更多 →
Nintendo Switch引导程序hekate快速入门指南:5步掌握安全启动与系统管理

Nintendo Switch引导程序hekate快速入门指南:5步掌握安全启动与系统管理

Nintendo Switch引导程序hekate快速入门指南:5步掌握安全启动与系统管理 【免费下载链接】hekate hekate - A GUI based Nintendo Switch Bootloader 项目地址: https://gitcode.com/gh_mirrors/he/hekate 还在为Nintendo Switch的自定义引导和系统管理感到困…

2026/10/17 9:34:04 阅读更多 →

最新新闻

室内矢量地图制作全流程:从CAD图纸清洗到路网寻路

室内矢量地图制作全流程:从CAD图纸清洗到路网寻路

简介:一份基于HTML5与矢量图形技术的室内地图资源包,面向网页前端开发者和位置服务应用人员,可用于大型商超、机场、展馆等复杂环境下的室内导航与区域标注。压缩包共171个文件,体积约2.47MB,以114个JavaScript脚本为主…

2026/10/20 8:15:31 阅读更多 →
用Python自动整理杂乱文件:从设计到实现的完整指南

用Python自动整理杂乱文件:从设计到实现的完整指南

你有多久没敢正视你的下载文件夹了?我在某天整理电脑时突然意识到,自己的下载目录里堆了两千多个文件,桌面还散落着几十个“新建文档”“屏幕截图”和各种版本号的压缩包。想找一份两个月前保存的合同,翻了五分钟没找到&#xff0…

2026/10/20 8:15:31 阅读更多 →
2026会议实时转写工具横评:从WER到纪要可用性的深度实测

2026会议实时转写工具横评:从WER到纪要可用性的深度实测

去年年底我们团队开始物色新的会议实时转写工具,到了2026年这一波技术升级,市面上热门的几款产品已经明显分成两个阵营:一类是办公套件顺手加进来的“赠品级”转写,另一类是专注把转写这件事做到极致的“专业队”。我把当前最火的…

2026/10/20 8:15:31 阅读更多 →
Spring Boot集成Motan RPC框架实战指南:从入门到排障

Spring Boot集成Motan RPC框架实战指南:从入门到排障

聊一聊Spring Boot和Motan这套组合。Motan是我这几年做微服务拆分时用得相当顺手的一套RPC框架,不像有些框架那样配置繁琐到劝退,也不像轻量到只适合玩具项目。如果你正打算在Spring Boot项目里引入RPC调用,或者在Dubbo、Feign、Motan之间纠结…

2026/10/20 8:15:31 阅读更多 →
智能代理系统安全响应演练实录:从告警到改进的完整复盘

智能代理系统安全响应演练实录:从告警到改进的完整复盘

很多团队都有过这样的矛盾:安全预案写了厚厚一叠,告警规则也配了一堆,但真正出问题的时候,大家还是手忙脚乱。文档里写着“发现异常立即上报”,没人告诉你异常长什么样;群里弹了告警,值班的人看…

2026/10/20 8:15:31 阅读更多 →
RAG面试高频考点全解析:从检索到生成的优化链路

RAG面试高频考点全解析:从检索到生成的优化链路

1. 为什么面试官揪着RAG不放:先把这个动机吃透我最近在系统梳理大模型方向的面试题,RAG(Retrieval-Augmented Generation,检索增强生成)几乎是每家必问的模块。尤其是做应用层项目的岗位,RAG的提问密度比微…

2026/10/20 8:14:30 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →