#牛客春招刷题训练营# + 链接
首先要理解题意(过于简洁以至于刚开始愣了)
01子序列指的就是 "01" 这样两位,那就很显然了
计数数组辅助双指针,直接over
#include <iostream> using namespace std; using ll = long long; const int MAXN=200010; char s[MAXN]; int main() { int n; ll k, res=0; scanf("%d%lld",&n, &k); scanf("%s", (s+1)); int cnt[2]={0}; ++cnt[s[1]-'0']; bool good=false; for (int x=1,y=1;x<=n;++x) { while (y<=n && res<k) { ++y; if (s[y]=='0') { ++cnt[0]; } else { res+=cnt[0]; ++cnt[1]; } } if (res==k) { good=true; printf("%d %d\n",x,y); break; } if (s[x]=='0') { res-=cnt[1]; --cnt[0]; } else { --cnt[1]; } } if (!good) { puts("-1"); } return 0; }