2025年GESP七级等价消除(洛谷P11965)代码解析与优化策略

贾蔷
• 阅读 14

2025年GESP七级等价消除(洛谷P11965)代码解析与优化策略 一、题目解读 2025年GESP七级考试中的“等价消除(洛谷P11965)”问题要求统计给定字符串中满足等价条件的子串数量。所谓“等价子串”,是指子串中所有字符出现的次数均相同。题目需要高效算法解决,考验对字符串处理和状态压缩的掌握。

二、解题思路 采用位运算+哈希表的核心思想: 1. 将字符映射为二进制位:每个字符(如'a'-'z')对应一位(如1<<('a'-'a')到1<<('z'-'a')),子串状态为各字符位异或结果。 2. 统计等价子串:若当前状态已存在,说明存在前缀与该子串等价,其子串数量计入答案;同时更新哈希表记录当前状态出现次数。

三、解题步骤 1. 初始化:定义哈希表stateCount,初始状态mask=0(空串)计数为1。 2. 遍历处理: 对每个字符,通过mask ^= (1 << (s[i] - 'a'))更新状态(异或操作实现字符添加/删除)。 查询stateCount[mask]获取当前状态的出现次数,累加到答案。 更新哈希表stateCount[mask]++。 3. 结果输出:返回累计的等价子串总数。

四、代码与注释

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

// 核心函数:统计等价子串数量
long long countEquivalentSubstrings(const string& s) {
   int n = s.size();
   long long count = 0;          // 答案计数器
   unordered_map<int, int> stateCount; // 记录状态出现次数
   stateCount[0] = 1;           // 空串状态初始化为1
   int mask = 0;                // 当前子串状态(二进制位表示)

   for (int i = 0; i < n; ++i) {
       mask ^= (1 << (s[i] - 'a'));  // 异或更新状态(字符转位操作)
       count += stateCount[mask];    // 累加已有状态的子串数
       stateCount[mask]++;          // 更新状态计数
   }

   return count;
}

int main() {
   ios::sync_with_stdio(false);
   cin.tie(nullptr);

   int n;
   string s;
   cin >> n >> s;   // 输入(题目可能有多组数据,但此处简化)
   cout << countEquivalentSubstrings(s) << endl;
   return 0;
}

原文:2025年GESP七级等价消除(洛谷P11965)代码解析与优化策略

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
str字符串 count( ) 方法
描述Pythoncount()方法用于统计字符串里某个字符出现的次数。可选参数为在字符串搜索的开始与结束位置。语法count()方法语法:str.count(sub,start0,endlen(string))参数sub搜索的子字符串start字符串开始搜索的位置
Kubrnete Kubrnete
4年前
动态规划之马拉车算法
问题描述:给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。如"abc"有三个回文子串‘a','b','c'.示例1:输入:"abc"输出:3解释:三个回文子串:"a","b","c"示例2:输入:"aaa"输出
DaLongggggg DaLongggggg
4年前
python百题大冲关-压缩字符串
挑战介绍实现一个算法来压缩一个字符串。压缩的要求如下:需要判断压缩能不能节省空间,仅在压缩后字符串比原字符串长度更短时进行压缩。压缩的格式是将连续相同字符替换为字符数字形式,例如"AAABCCDDDD"变为"A3BC2D4"。本次挑战中,你需要在compress_str.py文件中补充函数compress的空缺部分
Wesley13 Wesley13
3年前
2019 力扣杯
给出长度相同的两个字符串:A 和 B,其中A\i\和B\i\是一组等价字符。举个例子,如果 A"abc" 且 B"cde",那么就有 'a''c','b''d','c''e'。等价字符遵循任何等价关系的一般规则:自反性:'a''a'对称性:'a'
Wesley13 Wesley13
3年前
JS一个算法题
题目:实现超出整数存储范围的两个大整数想加function(a,b)。注意:参数a和b以及函数返回值都是字符串。目的:考算法,基本逻辑。我实现的基本思路是:①两个数字字符串长度补成一样,用字符串'0’补位,比如a'1111',b'22',b用'0'补位成'0022'.②分3中情况处理,初始值的长度比较,,a的长度大于b的长度,b的长
Stella981 Stella981
3年前
LeetCode 459. 重复的子字符串(Repeated Substring Pattern)
459\.重复的子字符串459\.RepeatedSubstringPattern题目描述给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。<spanclass"badgebadgepillbadgedanger"LeetCod
Stella981 Stella981
3年前
KMP算法 左神 最传统 最详细的思路 JAVA
本文只是一个学习后的总结,可能会有错误,欢迎各位指出。任意转载。题目:给定一个字符串str1和一个字符串str2,在字符串str1中找出字符串str2出现的第一个位置(从0开始)。如果不存在,则返回1。str1aaaaabcabcstr2abcabcaa前段时间偶然接触到左神的算法讲解视频,大概
Wesley13 Wesley13
3年前
HDU 6345(子串查询 暴力)
题意是每组给定一个字符串,在有限查询次数内输出所要查询区间的字典序最小的子串个数。字典序最小的子串,就是所查询区间中字典序最小的单个字符,问题就转化成了求一段区间内字典序最小的字符个数。开始时盲目暴力,直接用桶排序的做法一段一段去求,果然t了(这种就不贴代码了)......然后想到先扫一遍,求出从字符串首位到第i位的最小字符数,再用一个数组存
Stella981 Stella981
3年前
LeetCode459. 重复的子字符串
1.问题描述给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。示例1:输入:“abab”输出:True解释:可由子字符串“ab”重复两次构成。示例2:输入:“aba”输出:Fal
贾蔷 贾蔷
2天前
2013 蓝桥杯 省赛B组 翻硬币(洛谷P8597题) 从暴力BFS到贪心算法的优化之路
一、问题背景与理解洛谷P8597是一道经典的翻硬币问题,题目描述如下:给定两个由''和'o'组成的字符串s1和s2,分别表示初始状态和目标状态。每次操作可以选择任意位置开始翻转连续的k个硬币(''变'o','o'变'')。要求计算出从初始状态变为目标状态所