标签:mes c++ sync r++ 题意 namespace efi return continue
# 题意
给定一个字符串,要求在整个字符串出现过的字母在选取的区间中都出现至少K次,求最短区间有多短
# 题解
因为是最短区间所以用第一个出现的二分板
二分区间的长度
两个check
一个判断当前长度当前位置记录中整个字符串中出现的字符是否已经出现k次
一个check当前长度的区间是否满足条件
1 #include <bits/stdc++.h>
2 #define ll long long
3 using namespace std;
4 const int N=1e5+10;
5 string str;
6 int n,k;
7 unordered_map<char,int>rec,ans;
8 bool judge(){
9 for(int i=‘a‘;i<=‘z‘;i++){
10 int c=(char)i;
11 if(!rec[c]) continue;
12 if(ans[c]<k) return 0;
13 }
14 return 1;
15 }
16 bool check(int len){
17 ans.clear();
18 int l=0,r=len-1;
19 for(int i = l; i <= r; i++)
20 ans[str[i]]++;
21 while(r<n){
22 if(judge())
23 return true;
24 ans[str[l]]--;
25 l++;
26 r++;
27 if(r<n)
28 ans[str[r]]++;
29 }
30 return false;
31 }
32
33 int main(){
34 ios::sync_with_stdio(0);
35 cin.tie(0);
36 cout.tie(0);
37 int t;
38 cin >> t;
39 while(t--){
40 rec.clear();
41 cin>>n>>k;
42 cin>>str;
43 if(!k) {
44 cout << "0" << endl;
45 continue;
46 }
47 for(int i = 0; i < n; i++){
48 rec[str[i]]++;
49 }
50 bool flag=1;
51 for(int i=‘a‘;i<=‘z‘;i++) {
52 int c=(char)i;
53 if (rec[c]>0 && rec[c]<k){
54 flag=0;
55 break;
56 }
57 }
58 if(flag) {
59 int l = 1, r = n;
60 while (l < r) {
61 int mid = l + r >> 1;
62 if (check(mid)) {
63 r=mid;
64 } else
65 l=mid+1;
66 }
67 cout<<l<<endl;
68 }
69 else
70 cout<<"-1"<<endl;
71 }
72 }
标签:mes c++ sync r++ 题意 namespace efi return continue
原文地址:https://www.cnblogs.com/hhyx/p/12430967.html