1. /*
  2. 可以发现一个性质:连续两个相同色块永远不会变色
  3. 继而可以发现,这个色段每次迭代都向左向右拓展长度1,直到撞上其他扩张的色段
  4. 所以预处理出所有连续色段,然后对于所有不在色段里的点,我们可以预测其最终的颜色:
  5. 其本身每次迭代改变一次颜色,如果k>= 离其最近的那个色段到其的距离Len,那么其就会被那个色段覆盖
  6. 那么就要预处理出这些点两侧最近的色段距离和颜色
  7.  
  8. 由于是环形,所以扩张两倍即可来求边界
  9. */
  10. #include<bits/stdc++.h>
  11. #include<vector>
  12. using namespace std;
  13. #define N 400005
  14.  
  15. int f[N],c[N],k,n,L[N],R[N];
  16. char s[N];
  17.  
  18. int main(){
  19. cin>>n>>k;
  20. memset(c,0x3f,sizeof c);
  21. scanf("%s",s+);
  22. for(int i=;i<=n;i++)
  23. if(s[i]=='B')c[i]=c[i+n]=;
  24. else c[i]=c[i+n]=;
  25. c[]=c[n];c[*n+]=c[];
  26.  
  27. for(int i=;i<=*n;i++)
  28. if(c[i]==c[i-] || c[i]==c[i+])
  29. f[i]=;//连续点标记为1
  30.  
  31. //特判没有连续段,都是连续段
  32. int cnt=;
  33. for(int i=;i<=n;i++)cnt+=f[i];
  34. if(cnt==){//无连续段
  35. if(k%==){
  36. printf("%s",s+);
  37. }
  38. else {
  39. for(int i=;i<=n;i++)
  40. if(s[i]=='B')cout<<'W';
  41. else cout<<'B';
  42. puts("");
  43. }
  44. return ;
  45. }
  46. else if(cnt==n){
  47. printf("%s",s+);
  48. return ;
  49. }
  50.  
  51. //处理左边界
  52. int p=;
  53. while(f[p+]!=)++p;//找到第一个连续色段
  54. for(int i=p+;i<=*n;i++)
  55. if(!f[i])L[i]=p;
  56. else p=i;
  57.  
  58. //处理右边界
  59. p=*n+;
  60. while(f[p-]!=)--p;
  61. for(int i=p-;i>=;i--)
  62. if(!f[i])R[i]=p;
  63. else p=i;
  64. //010011,010011
  65. for(int i=;i<=n;i++){//回到环形上
  66. if(!f[i] && L[i]==)
  67. L[i]=L[i+n];
  68. if(!f[i] && R[i]>n)
  69. R[i]-=n;
  70. }
  71.  
  72. for(int i=;i<=n;i++)
  73. if(f[i]){
  74. cout<<s[i];
  75. }
  76. else {
  77. int disl,disr;
  78. if(L[i]>i)
  79. disl=n-L[i]+i;
  80. else
  81. disl=i-L[i];
  82.  
  83. if(R[i]<i)
  84. disr=R[i]+n-i;
  85. else
  86. disr=R[i]-i;
  87.  
  88. int dis=min(disl,disr);
  89. if(dis<=k){
  90. if(disl<disr){//被左侧覆盖
  91. if(disl<i)
  92. cout<<s[i-disl];
  93. else cout<<s[i+n-disl];
  94. }
  95. else {//被右侧覆盖
  96. if(i+disr<=n)
  97. cout<<s[i+disr];
  98. else cout<<s[i+disr-n];
  99. }
  100. }
  101. else {
  102. int now=(c[i]+k)%;
  103. if(now==)cout<<"B";
  104. else cout<<"W";
  105. }
  106. }
  107. puts("");
  108. }

思维+双指针+环——cf1244F的更多相关文章

  1. Lyft Level 5 Challenge 2018 - Final Round (Open Div. 2) C. The Tower is Going Home(思维+双指针)

    https://codeforces.com/contest/1075/problem/C 题意 一个宽为1e9*1e9的矩阵中的左下角,放置一个车(车可以移动到同一行或同一列),放置一些墙,竖的占据 ...

  2. Mouse Hunt CodeForces - 1027D(思维 找环)

    Medicine faculty of Berland State University has just finished their admission campaign. As usual, a ...

  3. HDU 6103 Kirinriki (思维 双指针)

    Kirinriki Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  4. CodeForces - 1007A (思维+双指针)

    题意 https://vjudge.net/problem/CodeForces-1007A 对一个序列重排,使得新的数比原来的数大对应的位置个数最多. 思路 举个栗子,比如1 2 2 3 3 3 3 ...

  5. Codeforces Global Round 12 D. Rating Compression (思维,双指针)

    题意:给你一长度为\(n\)的数组,有一长度为\(k\ (1\le k \le n)\)的区间不断从左往右扫过这个数组,总共扫\(n\)次,每次扫的区间长度\(k=i\),在扫的过程中,每次取当前区间 ...

  6. 第十二届湖南省赛 (B - 有向无环图 )(拓扑排序+思维)好题

    Bobo 有一个 n 个点,m 条边的有向无环图(即对于任意点 v,不存在从点 v 开始.点 v 结束的路径). 为了方便,点用 1,2,…,n 编号. 设 count(x,y) 表示点 x 到点 y ...

  7. Codeforces Round #513 by Barcelona Bootcamp C. Maximum Subrectangle(双指针+思维)

    https://codeforces.com/contest/1060/problem/C 题意 给两个数组,a数组有n个元素,b数组有m个元素,两个数组元素互相相乘形成n*m的矩阵,找一个子矩阵,元 ...

  8. CodeForces - 103B(思维+dfs找环)

    题意 https://vjudge.net/problem/CodeForces-103B 很久很久以前的一天,一位美男子来到海边,海上狂风大作.美男子希望在海中找到美人鱼 ,但是很不幸他只找到了章鱼 ...

  9. Almost Acyclic Graph CodeForces - 915D (思维+拓扑排序判环)

    Almost Acyclic Graph CodeForces - 915D time limit per test 1 second memory limit per test 256 megaby ...

随机推荐

  1. 每天一个Linux命令:rm(5)

    rm rm命令可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉.对于链接文件,只是删除整个链接文件,而原有文件保持不变 注意:使用rm命令要格外小心.因为 ...

  2. zk 后台调用前台点击事件

    Events.echoEvent(new Event(Events.ON_CLICK, view.getFellow("showYjdkhMessage"))); showYjdk ...

  3. 根据一个经纬度坐标获取周边最近经纬。Java实现

    1.需求:指定一个经纬度坐标,如:(31.2121751783,121.4411213954).周围有一堆经纬度坐标,找出与它最近的那个. 2.实现思路:将给出经纬度看成原点(0,0).周围经纬度定位 ...

  4. 修改Mysql数据库的字符集

    1.先检查数据库的默认字符集是否是引起不能存储中文的原因: 登录数据库后执行下面的命令 mysql> show variables like 'character%'; 由上图可以看出,data ...

  5. 2019 pycharm激活码

    http://lookdiv.com 里面有,钥匙:1211268069 激活码网址里面有 lookdiv.com 里面的钥匙就是lookdiv.com

  6. Jmeter beanshell断言 org.json.jar包下载

    链接:https://pan.baidu.com/s/1O01ODjlKyqmz2NyDT0MCww 提取码:a5va 欢迎关注微信公众号:软件测试汪,qq技术交流群:809111560

  7. JVM内存图

  8. redis基本介绍搭建篇

    1.redis基本介绍 1.1 redis介绍 Redis属于非关系型数据库和Memcached类似,redis也是一个key-value型存储系统. 但redis支持的存储value类型相对更多,包 ...

  9. Django框架(三十)—— 使用Vue搭建前台

    目录 vue的使用 一.创建vue项目 二.pycharm开发vue项目 1.安装vue.js插件 2.运行vue项目 三.vue项目的目录结构 四.vue的使用 1.创建新的组件 2.显示数据 3. ...

  10. sql合并字段

    <!-- 对发送方式合并查询 --> <!--查询所有满足条件的营销活动 --> <select id="CRM-MK-ACT-DEFINE-SELECT&qu ...