4 条题解

  • 1
    @ 2026-3-31 17:14:00

    套滑动窗口板子就行,注意结果要开long long

    #include<bits/stdc++.h>    
    using namespace std;
    int cnt[200];
    string s;
    int k;
    int main()
    {
        cin >> s>>k;
        s = " " + s;
        int n = s.size() - 1;
        //直接滑动窗口
        memset(cnt, 0, sizeof(cnt));
        int l = 1, r = 0;
        long long ans = 0;//记录满足字串的数量,要开long long
        for (; l <= n;l++)
        {
            while(r<n) //每一个l情况下,找到最长子串就能找到,对应的字串数量
            {
                r++;
                cnt[s[r]]++;//记录字符出现次数
                if(cnt[s[r]]>k)
                {
                    cnt[s[r]]--;     //值回退优先于,r回退
                    r--;
                    break;
                }
            }
            ans += r - l + 1;//对应的所以字串数量
            cnt[s[l]]--;
        }
        cout << ans << endl;
        return 0;
    }
    
    
    
    
    • 0
      @ 2026-3-31 13:26:32

      #include<bits/stdc++.h> using namespace std; #define int long long /* n个宝藏 有重量 问最大能拿多少 背包唯一限制为 mx-mi<=k 很明显先排序:然后双端指针不断中间逼近找到第一个满足为止 直接累加或者前缀和都先 但是我还有一个小优化 因为排序了 所以我想到二分 对于尾指针进行枚举从n-- 对于首指针可以二分 二分的判断是 mx-mi<=k 即mi>=mx-k */ const int N=1005; int a[N],s[N]; int n,k; int ans; signed main() { std::ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); cin>>n>>k; for(int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+1+n); //注意前缀和的位置于sort for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i]; //二分+双指针优化---mx-mi<=k-----mi>=mx-k-右1 int i=1; for(int j=n;j>i;j--)//枚举第后者 { int l=1,r=j-1; while(l<r) { int mid=l+r>>1; if(a[mid]>=a[j]-k) r=mid; else l=mid+1; } if(a[j]-a[l]<=k) { i=l; ans=max(ans,s[j]-s[l-1]); } } cout<<ans<<"\n"; return 0; }

      • 0
        @ 2026-3-16 21:00:13
        #include<bits/stdc++.h>
        using namespace std;
        typedef long long ll ;
        ll T=1;const ll N=1e5+5;
        ll a[N];ll n;ll ans;ll x,y;string s;
        map<char,ll>vis;
        bool check(ll l,ll r){
        	for(ll i=l;i<=r;++i){
        		if(vis[s[i]]>x)return 0;
        	}return 1;
        }
        ll cnt;
        void solve(){
        	
        	cin>>s;n=s.size();
        	s=" "+s;
        	cin >>x;
        	ll l=1;ll  r=1;
        	while(r<=n){
        		vis[s[r]]++;
        		while(vis[s[r]]>x){
        			vis[s[l]]--;
        			l++;
        		}
        		cnt+=r-l+1;
        		r++;
        		
        		
        	}
        	cout<<cnt;
        	
        
        }
        int main(){
        	while(T--)solve();
        	return 0;
        }
        
        • 0
          @ 2026-3-12 14:30:37
          import sys
          input = lambda:sys.stdin.readline().strip()
          
          s = input()
          k = int(input())
          n = len(s)
          left = 0
          from collections import defaultdict
          count = defaultdict(int)
          res = 0
              
          for right in range(n):
              count[s[right]] += 1
              while count[s[right]] > k:
                  count[s[left]] -= 1
                  left += 1   
              res += (right - left + 1)
          print(res)
          
          • 1

          信息

          ID
          679
          时间
          1000ms
          内存
          256MiB
          难度
          4
          标签
          递交数
          208
          已通过
          86
          上传者