求有多少个连续字串中所有的字母都出现了偶数次
给出一个长度为 n 的字符串(1<=n<=100000),求有多少个连续字串中所有的字母都出现了偶数次。
http://acm.upc.edu.cn/problem.php?id=1001
这题的思路是这样的,首先我们可以状压,每一位0代表该位代表字母的数量是偶数个,1则代表奇数个
那么我们记录一个前缀的状态,如果后面有欧串,则一定可以异或之前出现过的前缀得到全零的合法状态,
因此我们用map记录一下,之前有多少个相同状态的前缀就好了
不用枚举子串的原因是,我们总可以用长的前缀减去短的前缀来获得所有符合条件的子串,附上代码
#include <iostream> #include <cstdio> #include <cstring> #include <map> using namespace std; const int maxn=1e5+7; char s[maxn]; map<int,int> mp; typedef long long ll; int main(){ int T;scanf("%d",&T); while(T--){ scanf("%s",s);mp.clear(); int len=strlen(s); ll ans=0;int cur=0;mp[cur]=1; for(int i=0;i<len;++i){ cur^=(1<<(s[i]-'a')); ans+=mp[cur]; mp[cur]++; } printf("%lld\n",ans); } return 0; }