LC1915-最美子字符串的数目

1915. 最美子字符串的数目

解析:为了解决题目的问题,我们需要知道某一区间某个字符出现的次数,这里利用前缀和解决。

s[i][j] 表示前i个字符中,字符j + 'a' 出现的次数。

​ 对于s[i] 的10个分量,如果是偶数用0表示,如果是奇数则用1表示,最后压成一个二进制数 state。

​ 对于题中所要求的问题,即对于某个state,找到其他相同state的数目+只与其有一位不同的state的数目和。

using ll = long long;
const int N = 1e5 + 10;
int cnt[(2 << 10) + 10];
int s[N][10];//前i个字符中某个字符出现的次数
class Solution {
public:
    long long wonderfulSubstrings(string word) {
        ll n = word.size(),ans = 0;
        memset(cnt,0,sizeof cnt);
        cnt[0]++;
        for(int i = 1; i <= n; ++i){
            for(int j = 0; j < 10; ++j)
                if('a' + j == word[i - 1])s[i][j] = s[i - 1][j] + 1;
                else s[i][j] = s[i - 1][j];
            int state = 0;
            for(int j = 0; j < 10; ++j)state = (state << 1) + s[i][j] % 2;
            for(int j = 0; j < 10; ++j)ans += cnt[state ^ (1 << j)];
            ans += cnt[state] ++;
        }
        return ans;
    }
};
posted @ 2021-06-30 14:45  Ivessas  阅读(85)  评论(0)    收藏  举报