【阿里笔试】合法连续子段

合法连续子段_阿里巴巴笔试题_牛客网

【阿里笔试】合法连续子段

 

滑动窗口 + hash

#include <bits/stdc++.h>
using namespace std;
int main() {
    unordered_map<int, int> mp;
    int n, m;
    long long ans = 0;
    scanf("%d%d", &n, &m);
    vector<int> nums(n);
    for(int i = 0; i < n; ++i) scanf("%d", &nums[i]);
    for(int i = 0; i < m - 1; ++i) mp[nums[i]]++;
    int right = 0;
    for(int i = m - 1; i < n; ++i) {
        mp[nums[i]]++;
        if(mp[nums[i]] == m) {
            int left = right;
            while(nums[right] != nums[i]) {
                --mp[nums[right++]];
            }
            ans += (long long)(right - left + 1) * (n - i);
            --mp[nums[right++]];
        }
    }
    cout << ans << endl;
}

上一篇:Java基础语法--类型转换


下一篇:C++:取一个长string中间的一部分