C-平衡字符串(C++map

##顺带解决编译器自身引起的[error]no matching for call to…在这里插入图片描述

Input
QWER
Output
0    

Input
QQWE    
Output
1

Input
QQQW
Output
2

Input
QQQQ
Output
3

1<=n<=10^5
n是4的倍数
字符串中仅包含字符 ‘Q’, ‘W’, ‘E’ 和 ‘R’.
这道题在Dev上运行前,你依然需要准备一下Dev,因为它不支持C++11的语法,emmm,再来一遍它的操作,
直接运行我的这段代码会出现:
在这里插入图片描述
自从这种错误出多了,我就条件反射地去改它的编译器程序设置了,23333
look!
在这里插入图片描述
在这里插入图片描述
把我圈红的地方对照着改一波
在这里插入图片描述

解:本题采取了尺取的方法,需要注意的是连续区间长度始终是4的倍数,这样
简化了很多,(感觉
然后根据特定的区间内去计算每个元素的个数,保证每个元素的值是n/4个
然后我又去系统学习了一下map,这里不详写map,我会在笔记里详细记录

关于尺取法,这篇博客的例题可以参考一波,我把这道经典的例题记录下来吧,它差不多就是一个写尺取的模板了。
参考:尺取法经典例题
↓这个是尺取模板,解决平衡字符串的代码还在后面哦

#include <cstdio>
#include <algorithm>
#include <cstring>
#define MAX 100005
#define LL long long
#define INF 0x3f3f3f3f
using namespace std;
LL a[100010];
int n, t, ans = INF;
LL sum, s;
int main()
{
    scanf("%d", &t);
    while (t--){
        scanf("%d %I64d", &n, &s);
        for (int i = 0; i < n; i++) scanf("%I64d", a+i);
        int st = 0, en = 0;
        ans = INF; sum = 0;
        while (1){
            while (en<n && sum<s) sum += a[en++];
            if (sum < s) break;
            ans = min(ans, en-st);
            sum -= a[st++];
        }
        if (ans == INF) ans = 0;
        printf("%d\n", ans);
    }
    return 0;
}

不知不觉就说了这么多话,直接看代码吧!

#include<stdio.h>
#include<iostream>
#include<map>
#include<string.h>
using namespace std;
map<char,int> mp({
 {'Q',0},
 {'W',1},
 {'E',2},
 {'R',3}
});
const int maxn=2*1e5+10;
char str[maxn];
int sum[4];
int main(){
 int l=0,r=0;
 scanf("%s",str);
 int n=strlen(str);
 for(int i=0;i<n;i++)
  sum[mp[str[i]]]++;
 int ans=maxn;
 while(r<n){
  sum[mp[str[r]]]--;
  int flag=1;
  for(int i=0;i<4;i++){
   if(sum[i]> n/4){
    flag=0;
    break;
   }
  }
  while(l<n && flag){
   sum[mp[str[l]]]++;
   ans=min(ans,r-l+1);
   if(sum[mp[str[l]]]>n/4)
    flag=0;
   l++;
  }
  r++; 
 }
 if(ans==maxn) printf("0\n");
 else printf("%d\n",ans);
 return 0;
}

还有一个问题我必须要说一下,这个明明是C++,但是每次都得用scanf或者printf,不然它就会超时,真烦,怎么解决这个问题呢?我去查了查,还真有

std::ios::sync_with_stdio(false);

因为在使用cout 和cin的时候,它会有一个和C语言的scanf和printf同步的一个过程,这个过程会导致C++输入输出有一个缓冲时间,加上那句话后,就可以安心使用cin和cout啦!

#include<iostream>
using namespace std;//如果没有这句,就用上面那句,有就可以不加std::
int main(){
	ios::sync_with_stdio(false);
	cin....cout....
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值