二分法:
要求:pc2-pc1+1>=k
变形:i(pc2)-k+1>=pc1
#include <iostream>
#include <string>
#include<vector>
#define int long long
using namespace std;
void solve()
{int k;cin >> k;char c1, c2;cin >> c1 >> c2;string s;cin >> s;int ans = 0;vector <int>pc1;//储存c1的位置for (int i = 0; i < s.size(); i++){if(s[i]==c1) pc1.push_back(i);if(s[i]==c2){if(!pc1.size()||i-k+1<0) continue;int l=0,r=(int)pc1.size()-1;while(l<r){int mid=l+r+1>>1;if(pc1[mid]<=(i-k+1)) l=mid;else r=mid-1;}if(pc1[l]<=i-k+1) ans+=(l+1);}}cout << ans;
}
signed main()
{solve();return 0;
}