Codeforces 1196D2 RGB Substring (Hard version) 题解
题面
\(q\) 个询问,每个询问给出一个字符串 \(s\),要你在 \(s\) 中用最小替换得到无穷字符串 RGBRGBRGB... 的长度为定值 \(k\) 的子串。
题解
一眼看过去可能是编辑距离什么的,但是仔细看 Hard 下的时间复杂度不允许,然后进行了一波分析...

上图模式串 2 同理。
从上图可以发现,其实就是主串往后移动一位的同时模式串也往后移动一位匹配,同时去掉无用信息即可。
代码
#include<cstdio>
#include<climits>
#include<algorithm>
#include<cstring>
const int MAXN=2e5+5;
int q,n,m,tot[3],v[3][2],value[MAXN],ans;char str[MAXN];
int main()
{
scanf("%d",&q);
for(;q>=1;q--)
{
memset(tot,0,sizeof(tot));
memset(v,0,sizeof(v));
ans=INT_MAX;
scanf("%d %d",&n,&m);
scanf("%s",str+1);
for(int i=0;i<3;i++)
v[i][0]=v[i][1]=i;
for(int i=1;i<=n;i++)
{
value[i]=(str[i]=='R')?0:(str[i]=='G'?1:2);
}
for(int i=1;i<=m;i++)
for(int j=0;j<3;j++)
{
if(value[i]==v[j][1])
{
tot[j]++;
}
v[j][1]=(v[j][1]+1)%3;
//printf("%d %d %d %d %d %d\n",i,j,v[j][0],v[j][1],value[j],tot[j]);
if(i==m)
{
ans=std::min(ans,m-tot[j]);
}
}
for(int i=m+1;i<=n;i++)
{
for(int j=0;j<3;j++)
{
if(value[i-m]==v[j][0])
{
tot[j]--;
}
if(value[i]==v[j][1])
{
tot[j]++;
}
v[j][1]=(v[j][1]+1)%3;
v[j][0]=(v[j][0]+1)%3;
ans=std::min(ans,m-tot[j]);
//printf("%d %d %d %d %d %d\n",i,j,v[j][0],v[j][1],value[j],tot[j]);
}
}
printf("%d\n",ans);
}
return 0;
}
Codeforces 1196D2 RGB Substring (Hard version) 题解的更多相关文章
- Codeforces 1196D2. RGB Substring (hard version)
传送门 考虑枚举每一个位置作为可能子段的起点,然后对以这个位置为起点的所有情况下的答案取 $min$ 当固定了起点 $i$ 并且固定了起点 $i$ 最终的字符时,答案也固定了 发现对于所有与 $i \ ...
- Codeforces Round #575 (Div. 3) D2. RGB Substring (hard version) 【递推】
一.题目 D2. RGB Substring (hard version) 二.分析 思路一开始就想的对的,但是,用memset给数组初始化为0超时了!超时了! 然后我按照题解改了个vector初始化 ...
- Codeforces Round #575 (Div. 3) D2. RGB Substring (hard version) 水题
D2. RGB Substring (hard version) inputstandard input outputstandard output The only difference betwe ...
- Codeforces Round #575 (Div. 3) D1+D2. RGB Substring (easy version) D2. RGB Substring (hard version) (思维,枚举,前缀和)
D1. RGB Substring (easy version) time limit per test2 seconds memory limit per test256 megabytes inp ...
- [题解]RGB Substring (hard version)-前缀和(codeforces 1196D2)
题目链接:https://codeforces.com/problemset/problem/1196/D2 题意: q 个询问,每个查询将给你一个由 n 个字符组成的字符串s,每个字符都是 “R”. ...
- Codeforces Round #575 (Div. 3) D2. RGB Substring (hard version)
传送门 题意: 给你一个长为n的仅由'R','G','B'构成的字符串s,你需要在其中找出来一个子串.使得这个子串在"RGBRGBRGBRGB........(以RGB为循环节,我们称这个串 ...
- CF1203D2 Remove the Substring (hard version) 题解
这题初赛让我白给了6分,于是我决定回来解决一下它. 说实话,看原题题面和看CCF代码真是两种完全不同的感受…… ------------思路分析: 把$s$串删去一部分之后,会把$s$串分成两部分,当 ...
- D2. Remove the Substring (hard version)(思维 )
D2. Remove the Substring (hard version) time limit per test 2 seconds memory limit per test 256 mega ...
- # Codeforces Round #529(Div.3)个人题解
Codeforces Round #529(Div.3)个人题解 前言: 闲来无事补了前天的cf,想着最近刷题有点点怠惰,就直接一场cf一场cf的刷算了,以后的题解也都会以每场的形式写出来 A. Re ...
随机推荐
- markdown简1
1.使用 = 和 - 标记一级和二级标题 = 和 - 标记语法格式如下: 我展示的是一级标题 ================= 我展示的是二级标题 ----------------- 我展示的是一级 ...
- Tensorflow机器学习入门——读取数据
TensorFlow 中可以通过三种方式读取数据: 一.通过feed_dict传递数据: input1 = tf.placeholder(tf.float32) input2 = tf.placeho ...
- HYStockChart, 股票图(包括K线图、趋势图、成交量、滚动、放大缩小等)
HYStockChart, 股票图(包括K线图.趋势图.成交量.滚动.放大缩小等) https://www.helplib.com/GitHub/article_127980git 地址 http:/ ...
- 洛谷 P3808 【模板】AC自动机(简单版) (AC自动机优化板子)
题中有一个坑点,就是模式串可以相同,并且全部计数. #include <bits/stdc++.h> using namespace std; const int maxn=1e6+10; ...
- hadoop集群启动报错: java.io.IOException: Incompatible clusterIDs
java.io.IOException: Incompatible clusterIDs in /export/hadoop-2.7.5/hadoopDatas/datanodeDatas2: nam ...
- 201771010135杨蓉庆 《面向对象程序设计(java)》第三周学习总结
一:第1-3章学习内容: 第一章:复习基本数据类型 整型 byte(1个字节 表示范围:-2^7 ~ (2^7)-1) short(2个字节 表示范围:-2^15~(2^15)-1) int(4个字节 ...
- 吴裕雄 python 神经网络——TensorFlow pb文件保存方法
import tensorflow as tf from tensorflow.python.framework import graph_util v1 = tf.Variable(tf.const ...
- 有未经处理的异常: 0xC00000FD: Stack overflow
将“项目属性.链接器.系统.堆栈保留大小”设大一点比如16000000 这是我在网上找到的答案,很好的解决了我的问题,忘了是哪位大神了,总之,向大神致敬
- 如何判断WLC的FUS版本
有些时候,我们在升级WLC的时候,被告知需要升级WLC的FUS,以防止某些漏洞和不必要的情况发生. 1.什么是FUS? Field Upgrade Software (FUS),翻译过来,叫“现场升级 ...
- lc 0226
目录 ✅ 232. 用栈实现队列 描述 解答 c py ✅ 496. 下一个更大元素 I 描述 解答 java another java ✅ 232. 用栈实现队列 https://leetcode- ...