求有多少个连续字串中所有的字母都出现了偶数次

给出一个长度为 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;
}

 

posted @ 2017-05-01 16:59  狡啮之仰  阅读(771)  评论(0编辑  收藏  举报