欢迎大家订阅我的专栏:算法题解:C++与Python实现!
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!
专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。
适合人群:
- 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
- 希望系统学习C++/Python编程的初学者
- 想要提升算法与编程能力的编程爱好者
附上汇总帖:GESP认证C++编程真题解析 | 汇总
【题目来源】
洛谷:P11965 [GESP202503 七级] 等价消除 - 洛谷 (luogu.com.cn)
【题目描述】
小 A 有一个仅包含小写英文字母的字符串S SS。
对于一个字符串,如果能通过每次删去其中两个相同字符的方式,将这个字符串变为空串,那么称这个字符串是可以被等价消除的。
小 A 想知道S SS有多少子串是可以被等价消除的。
一个字符串S ′ S'S′是S SS的子串,当且仅当删去S SS的某个可以为空的前缀和某个可以为空的后缀之后,可以得到S ′ S'S′。
【输入】
第一行,一个正整数∣ S ∣ |S|∣S∣,表示字符串S SS的长度。
第二行,一个仅包含小写英文字母的字符串S SS。
【输出】
一行,一个整数,表示答案。
【输入样例】
7 aaaaabb【输出样例】
9【算法标签】
《洛谷 P11965 等价消除》 #前缀和# #位运算# #GESP# #2025#
【代码详解】
#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong// 定义宏,将int替换为long long类型constintN=2e5+5;// 定义最大字符数intn,x,ans;// n: 字符串长度,x: 当前异或值,ans: 结果计数chara[N];// 存储输入的字符串map<int,int>mp;// 哈希表,记录异或值出现的次数signedmain(){cin>>n;// 输入字符串长度cin>>a;// 输入字符串mp[0]=1;// 初始化:空字符串的异或值为0,出现1次for(inti=0;i<n;i++){// 计算当前字符对应的位,并更新异或值x^=(1<<(a[i]-'a'));// 如果当前异或值之前出现过,则存在满足条件的子串ans+=mp[x];// 更新当前异或值的出现次数mp[x]++;}cout<<ans<<endl;// 输出满足条件的子串数量return0;}【运行结果】
7 aaaaabb 9