题解:瑞学堂 瑞瑞的字符统计
本文分享的必刷题目是从蓝桥云课、洛谷、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/8/7 17:53:41 阅读更多 →
CmzPrep_Rev2 | 免U盘重装!

CmzPrep_Rev2 | 免U盘重装!

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

2026/8/7 17:53:41 阅读更多 →
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/8/7 17:53:41 阅读更多 →

最新新闻

STM32 HAL库中断机制全解析:从原理到实战避坑指南

STM32 HAL库中断机制全解析:从原理到实战避坑指南

1. 项目概述:为什么需要深入理解HAL库中断?如果你正在用STM32做项目,尤其是从标准库或者寄存器操作转向HAL库,中断配置这块大概率是你踩的第一个坑,也可能是最频繁的一个。我见过太多新手写的代码,中断要么…

2026/8/8 1:56:23 阅读更多 →
腾讯云轻量服务器蜂驰版深度测评:高频CPU与高性能云硬盘实战解析

腾讯云轻量服务器蜂驰版深度测评:高频CPU与高性能云硬盘实战解析

1. 项目概述:为什么我们需要关注“蜂驰版”? 最近在折腾个人项目,从博客、小程序到一些自动化脚本,对轻量级云服务器的需求一直没断过。市面上选择不少,但每次选型都像开盲盒,参数表看着都差不多&#xff0…

2026/8/8 1:56:23 阅读更多 →
AI对话系统短期记忆设计:压缩、整理与控制策略实践

AI对话系统短期记忆设计:压缩、整理与控制策略实践

1. 项目概述:单线程短期记忆的挑战与机遇最近在折腾一个基于Next.js的AI对话项目,名字叫“AI Mind”。这名字听起来挺唬人,但核心问题其实很接地气:怎么让这个AI在跟你聊天的时候,能记住刚才说了啥,但又不会…

2026/8/8 1:56:23 阅读更多 →
基于ESP32与LVGL的实时航班雷达系统开发实战

基于ESP32与LVGL的实时航班雷达系统开发实战

在实际嵌入式开发项目中,ESP32因其强大的Wi-Fi/蓝牙连接能力和丰富的外设接口,常被用于制作各种物联网终端。将一块触摸屏与ESP32结合,打造一个能够实时显示航班雷达信息的桌面设备,是一个集网络通信、数据解析、图形界面和硬件交…

2026/8/8 1:56:23 阅读更多 →
电源噪声与纹波的本质区别、测量陷阱及工程应对策略

电源噪声与纹波的本质区别、测量陷阱及工程应对策略

1. 从一次深夜调试说起:为什么搞清噪声和纹波至关重要 上周,我团队里一个刚入行的硬件工程师小张,为了一个DC-DC电源模块的输出质量折腾到凌晨三点。他信誓旦旦地告诉我,输出“噪声”超标了,导致后级ADC采样值跳得厉害…

2026/8/8 1:56:23 阅读更多 →
JMeter自动化测试脚本编写全攻略:从架构设计到性能优化

JMeter自动化测试脚本编写全攻略:从架构设计到性能优化

1. 项目概述:从零到一,构建高效的JMeter自动化测试脚本如果你正在接触性能测试或者接口自动化,那么JMeter这个名字你一定不陌生。作为一个开源的、功能强大的负载测试工具,它几乎是性能测试工程师的标配。但很多朋友在初次上手时&…

2026/8/8 1:55:23 阅读更多 →

日新闻

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

当下AI应用飞速普及,无数企业下场搭建智能体系统,可落地阶段难题接踵而至:上下文无限堆积频繁爆栈、AI工具调用准确率低下、Token成本居高不下、企业数据权限混乱暗藏安全隐患……很多团队卡在架构搭建环节,空有前沿技术概念&…

2026/8/8 0:00:07 阅读更多 →
PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码 【免费下载链接】php-qrcode A PHP QR Code generator and reader with a user-friendly API. 项目地址: https://gitcode.com/gh_mirrors/ph/php-qrcode 在当今数字时代,二维码已…

2026/8/8 0:00:08 阅读更多 →
UniApp微信小程序隐私保护组件开发:从原理到实战

UniApp微信小程序隐私保护组件开发:从原理到实战

1. 项目缘起:为什么我们需要一个隐私保护通用组件?最近在维护一个基于uniapp开发的微信小程序矩阵时,我遇到了一个非常棘手的问题。随着平台对用户隐私保护的要求越来越严格,几乎每一个新版本发布,或者在某些特定机型&…

2026/8/8 0:00:08 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/7 23:24:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/7 17:02:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/7 23:54:54 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/7 17:02:36 阅读更多 →