GESP认证C++编程真题解析 | P11965 [GESP202503 七级] 等价消除

​欢迎大家订阅我的专栏:算法题解:C++与Python实现!
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!

专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。

适合人群:

  • 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
  • 希望系统学习C++/Python编程的初学者
  • 想要提升算法与编程能力的编程爱好者

附上汇总帖:GESP认证C++编程真题解析 | 汇总


【题目来源】

洛谷:P11965 [GESP202503 七级] 等价消除 - 洛谷 (luogu.com.cn)

【题目描述】

小 A 有一个仅包含小写英文字母的字符串 S S S

对于一个字符串,如果能通过每次删去其中两个相同字符的方式,将这个字符串变为空串,那么称这个字符串是可以被等价消除的。

小 A 想知道 S S S 有多少子串是可以被等价消除的。

一个字符串 S ′ S' S S S S 的子串,当且仅当删去 S S S 的某个可以为空的前缀和某个可以为空的后缀之后,可以得到 S ′ S' S

【输入】

第一行,一个正整数 ∣ S ∣ |S| S,表示字符串 S S S 的长度。

第二行,一个仅包含小写英文字母的字符串 S S S

【输出】

一行,一个整数,表示答案。

【输入样例】

7
aaaaabb

【输出样例】

9

【算法标签】

《洛谷 P11965 等价消除》 #前缀和# #位运算# #GESP# #2025#

【代码详解】

#include 
using namespace std;

#define int long long  // 定义宏,将int替换为long long类型
const int N = 2e5 + 5;  // 定义最大字符数
int n, x, ans;          // n: 字符串长度,x: 当前异或值,ans: 结果计数
char a[N];              // 存储输入的字符串
map<int, int> mp;       // 哈希表,记录异或值出现的次数

signed main() {
    cin >> n;         // 输入字符串长度
    cin >> a;         // 输入字符串

    mp[0] = 1;        // 初始化:空字符串的异或值为0,出现1次

    for (int i = 0; i < n; i++) {
        // 计算当前字符对应的位,并更新异或值
        x ^= (1 << (a[i] - 'a'));
        
        // 如果当前异或值之前出现过,则存在满足条件的子串
        ans += mp[x];
        
        // 更新当前异或值的出现次数
        mp[x]++;
    }

    cout << ans << endl;  // 输出满足条件的子串数量
    return 0;
}

【运行结果】

7
aaaaabb
9

你可能感兴趣的:(c++,算法,数据结构)