一个字符串S是偶串当且仅当S中的每一个字符都出现了偶数次。如字符串”aabccb”是一个偶串,因为字符a,b,c都出现了两次。而字符串”abbcc”不是偶串,因为字符a出现了一次。
现在给出一个长度为n的字符串T=t1,t2,t3,…,tn。字符串的子串为其中任意连续一段。T长度为1的子串有n个,长度为2的子串有n-1个,以此类推,T一共有n(n+1)/2个子串。给定T,你能算出它有多少个子串是偶串吗?
输入:输入一个字符串T,T中只有小写字母。T的长度不超过100000。
输出:输出一个数,T的所有子串中偶串的个数。
解答:
要点:相同元素异或为0;利用移位运算来保存各个字符的奇偶性
过程: 根据偶串各个元素异或操作为零,采用二进制数来保存各个字符的奇偶性,一旦二进制数出现相等,即偶串出现,若多次出现相同的二进制数,则存在偶串相连的情况,故采用类似前缀和的方式来计算偶串。
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<map>
#define maxn 100009
using namespace std;
char s[maxn];
map<int, int>mp;
int n;
int main(){
scanf("%s", s);
n = strlen(s);
mp[0] = 1;
int cur = 0;
long long ans = 0;
for (int i = 0; i < n; i++){
int x = s[i] - 'a';
cur ^= (1 << x);
ans += mp[cur];
mp[cur]++;
}
cout << ans << endl;
return 0;
}