abc295D 統計由SS構成的子串個數

chenfy27發表於2024-03-07

給出長為n的數字串,問它存在多少個子串是happy串?happy串指經重排後,可以由兩段同樣的內容連起來拼成,比如12341234。
資料範圍:1<=n<=5E5

雜湊判斷是否相同,只需要判斷各個數字出現的奇偶性即可。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a; i<=b; i++)
#define per(i,a,b) for(int i=b; i>=a; i--)

struct node {
    int cnt[10];
    node() {
        rep(i,0,9) cnt[i] = 0;
    }
    void add(int x) {
        cnt[x] += 1;
        cnt[x] %= 2;
    }
    int encode() {
        int h = 0;
        rep(i,0,9) {
            h = h * 3 + cnt[i];
        }
        return h;
    }
};
map<int,int> cnt;
string s;
void solve() {
    cin >> s;
    node nd;
    int ans = 0;
    cnt[0] = 1;
    for (auto c : s) {
        nd.add(c-'0');
        int k = nd.encode();
        ans += cnt[k];
        cnt[k] += 1;
    }
    cout << ans << "\n";
}

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

相關文章