我是什么东西艹艹艹

《我离正解只差个sort》

首先,观察字符串,可以发现:若存在形似\(AA……BB\)或\(BB……AA\)等有两个相同的字符挨在一起的情况,则我们在它们中间放一块隔板

\(BAABBABBAA\rightarrow\) \(BA\) \(AB\) \(BAB\) \(BA\) \(A\)

$ABABABBAABAB\rightarrow $ \(ABABAB\) \(BA\) \(ABAB\)

那么,位于同一区间的所有字符都是\(AB\)相间的形式,也就是说,可以用碎片\(AB\)和\(BA\)来拼凑出它们

当某一区间的字符个数为奇数时,如\(ABA\),若想使用\(AB\)或\(BA\),则一定会删去一个\(A\),而具体是哪一个\(A\),并不用关心(删去不同的\(A\),则会导致用于表示这一区间的碎片不同,后文会具体提到)

称一个区间最理想的使用碎片的情况(即全用一种碎片拼凑出整个区间)为一个区间使用的碎片

当某一区间的字符个数为偶数时,如\(ABABABABAB\),那么最理想的情况是用五个\(AB\)来凑这段区间,而当我们\(AB\)不够用的时候,设当前只有两个\(AB\),则可以将原区间用\(ABAB\),\(A\),\(BABA\),\(B\)拼凑出来

也就是说,当前区间为偶数时,可以通过使用一个\(A\)与\(B\)来使得区间使用的碎片发生变化

综上,可以发现,当区间为奇数时,它使用的碎片是不确定的,而当区间为偶数时,它使用的碎片是确定的(偶区间使用的碎片可以使用\(A\)与\(B\)来改变)

所以,我们先处理区间为偶数时的情况,因为这时使用的碎片确定

当有多个偶数区间使用的碎片都为\(AB\)时,举个例子:

\(AB\) \(AB\) \(ABABABAB\) \(ABABABABAB\)

我们将这些区间按照大小从小到大排序,因为\(AB\)不一定能都填满所有的区间,所以我们从长度小的区间开始填,这样,我们就能保证被填满的区间最多,而没有填满的区间使用\(A\)和\(B\)来进行转换其使用的碎片,这样就能确保我们使用的\(A\)和\(B\)尽可能少

原因:对于我们仅有的\(A\),\(B\),它们可以用来更改区间使用的碎片以及填充区间,既其能够使用的情况与其作用是远远大于\(AB\)和\(BA\)的,所以我们希望\(A\),\(B\)能够尽可能多的剩下

在我们解决完偶区间后,我们考虑奇区间

首先,若当前区间为\(AB……BA\)的形式,则用一个碎片\(A\)替代最前面或最后面的\(A\)(相当于删去最前面或最后面的\(A\)),这样就能使用\(AB\)或\(BA\)去填满这个区间

$ABABABABABA\rightarrow $ \(A\) \(BABABABABA\)

而若我们剩下的\(AB\)或\(BA\)不能靠自己这一类去填满当前区间,也就是我们需要用\(AB\)和\(BA\)两种碎片给来拼凑同一区间,则我们将碎片\(A\)替代的字符变成区间中一个非端点的\(A\),此时区间被划分成了两半,左边一半使用的碎片为\(AB\),右边一半使用的碎片为\(BA\)

\(ABABABABABA\rightarrow\) \(ABAB\) \(A\) \(BABABA\)

综上,对于奇区间,无论怎样用\(AB\)和\(BA\)拼凑,都只需要用一个\(A\)或\(B\),所以我们只需要在偶区间操作完后再判断一下\(A/B\)的数量+\(AB\)的数量+\(BA\)的数量是否能填满奇区间即可

对于\(A/B\):若我们先将奇区间中使用的单个A和B删去后,A和B的数量一定是相等的,因为它们在偶区间中的使用是成对出现的

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=2e5+5;
  4. int a,b,c,d,n,cnt1,cnt2,qk[N],tot;
  5. int sum,sum1,sum2;
  6. char s[N];
  7. vector<int> t1,t2;
  8. int main(){
  9. int T;
  10. scanf("%d",&T);
  11. while(T--){
  12. cnt1=cnt2=tot=sum=sum1=sum2=0;
  13. t1.clear(),t2.clear();
  14. scanf("%d%d%d%d",&a,&b,&c,&d);
  15. getchar(); cin>>s+1;
  16. n=strlen(s+1);
  17. if(a+b+(c+d<<1)!=n){ printf("NO\n"); continue; }
  18. for(int i=1;i<=n;++i) if(s[i]=='A') ++cnt1; else ++cnt2;
  19. if(cnt1!=a+c+d||cnt2!=b+c+d){ printf("NO\n"); continue; }
  20. for(int i=2;i<=n;++i) if(s[i]==s[i-1]) qk[++tot]=i-1;
  21. qk[++tot]=n;
  22. for(int i=1;i<=tot;++i){
  23. int t=qk[i]-qk[i-1]>>1;
  24. if((qk[i]-qk[i-1])%2){
  25. if(s[qk[i]]=='A') --a;
  26. else --b;
  27. sum+=t;
  28. }else{
  29. if(s[qk[i]]=='A') sum2+=t,t2.push_back(t);
  30. else sum1+=t,t1.push_back(t);
  31. }
  32. }
  33. if(a<0||b<0||a!=b){ printf("NO\n"); continue; }
  34. sort(t1.begin(),t1.end()),sort(t2.begin(),t2.end());
  35. for(int i=0;i<t1.size();++i){
  36. if(c>=t1[i]) c-=t1[i];
  37. else{
  38. if(d+c+1>=t1[i]) d-=(t1[i]-c-1),--a,c=0;
  39. else a-=(t1[i]-c-d),d=0,c=0;
  40. }
  41. if(a<0||c<0||d<0) break;
  42. }
  43. if(a<0||c<0||d<0){ printf("NO\n"); continue; }
  44. for(int i=0;i<t2.size();++i){
  45. if(d>=t2[i]) d-=t2[i];
  46. else{
  47. if(d+c+1>=t2[i]) c-=(t2[i]-d-1),--a,d=0;
  48. else a-=(t2[i]-d-c),d=0,c=0;
  49. }
  50. if(a<0||c<0||d<0) break;
  51. }
  52. if(a<0||c<0||d<0){ printf("NO\n"); continue; }
  53. if(a+c+d>=sum) printf("YES\n");
  54. else printf("NO\n");
  55. }
  56. return 0;
  57. }

[Codeforces Round #794 (Div. 2)] D. Linguistics的更多相关文章

  1. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  2. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  3. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  4. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  5. Codeforces Round #279 (Div. 2) ABCDE

    Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems     # Name     A Team Olympiad standard input/outpu ...

  6. Codeforces Round #262 (Div. 2) 1003

    Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...

  7. Codeforces Round #262 (Div. 2) 1004

    Codeforces Round #262 (Div. 2) 1004 D. Little Victor and Set time limit per test 1 second memory lim ...

  8. Codeforces Round #371 (Div. 1)

    A: 题目大意: 在一个multiset中要求支持3种操作: 1.增加一个数 2.删去一个数 3.给出一个01序列,问multiset中有多少这样的数,把它的十进制表示中的奇数改成1,偶数改成0后和给 ...

  9. Codeforces Round #268 (Div. 2) ABCD

    CF469 Codeforces Round #268 (Div. 2) http://codeforces.com/contest/469 开学了,时间少,水题就不写题解了,不水的题也不写这么详细了 ...

  10. 贪心+模拟 Codeforces Round #288 (Div. 2) C. Anya and Ghosts

    题目传送门 /* 贪心 + 模拟:首先,如果蜡烛的燃烧时间小于最少需要点燃的蜡烛数一定是-1(蜡烛是1秒点一支), num[g[i]]记录每个鬼访问时已点燃的蜡烛数,若不够,tmp为还需要的蜡烛数, ...

随机推荐

  1. Linux三剑客sed

    注意sed和awk使用单引号,双引号有特殊解释 sed是Stream Editor(字符流编辑器)的缩写,简称流编辑器. sed是操作.过滤和转换文本内容的强大工具. 常用功能包括结合正则表达式对文件 ...

  2. [VUE]报错: No Babel config file detected for

    在使用vue脚手架创建的项目中,项目中每个文件的第一行都会有红色波浪线. 解决方法:在项目文件中找到package.json文件,在parserOptions里添加"requireConfi ...

  3. 【JVM】关于JVM,你需要掌握这些 | 一文彻底吃透JVM系列

    写在前面 最近,一直有小伙伴让我整理下关于JVM的知识,经过十几天的收集与整理,初版算是整理出来了.希望对大家有所帮助. JDK 是什么? JDK 是用于支持 Java 程序开发的最小环境. Java ...

  4. KeeWiDB的高性能修炼之路:架构篇

    数据也有冷热之分,你知道吗? 根据访问的频率的高低可将数据分为热数据和冷数据,访问频率高的则为热数据,低为冷数据.如果热.冷数据不区分,一并存储,显然不科学.将冷数据也存储在昂贵的内存中,那么你想,成 ...

  5. java学习之JSON

    0X00前言 JSON可以说是javascript的一种数据类型,我们学习JSON是为了在客户端的数据给读取出来,官方的解释是:概述:JSON(JavaScript Object Notation, ...

  6. java学习之socket编程

    0x00前言和思维导图 Socks实际上是什么:实际上是提供了精彩通信的端口,在通信之前双方都必须要创造一个端点才能通信,其实感觉socket跟计算机的三次握手有些相似,分为三个步骤: (1)服务器监 ...

  7. Codeforces Round #817 (Div. 4)

    CF传送门 因为洛谷题库未更新,所以给出的题面都是CF的. 现场打真是太卡了(梯子挂了,codeforc.es也崩了),所以五六分钟才打开题目 \(qwq\) A. Spell Check 萌萌题,把 ...

  8. 嵌入式-C语言基础:快速选择排序实现从大到小排序

    #include<stdio.h> int main() { /*简单选择排序:从大到小:一共比较sizeArr-1轮,每一轮的第一个数是arr[i],第一个数依次和它后面的每个数比较*/ ...

  9. 2022-11-14 Acwing每日一题

    本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我会认真改正的.同时也希望 ...

  10. centos7 ftp服务搭建记录

    1. 装包与卸载 yum -y install vsftpd yum -y autoremove vsftpd&&rm -rf /etc/vsftpd /etc/pam.d/vsftp ...