当前位置:网站首页>Educational Codeforces Round 112 D. Say No to Palindromes
Educational Codeforces Round 112 D. Say No to Palindromes
2022-08-08 20:47:00 【CCSU_梅子酒】
题目链接:D. Say No to Palindromes
题意:定义一个字符串是美丽的,当且仅当字符的任意长度大于 1 1 1的子串不是回文串。给定仅由三个小写字母 a , b , c a,b,c a,b,c组成的长度为 n n n的字符串,你能将字符串的任意字母更改为 a , b , c a,b,c a,b,c三个小写字母的任意一个,更改一个字母的花费为 1 1 1。 询问 m m m次,每次询问 [ l , r ] [l,r] [l,r]区间的子串的变成美丽的串的最小花费。
思路: 因为字母仅有 a , b , c a,b,c a,b,c三个小写字母,可以自己在纸上写几个子串,观察怎样构造才是美丽的字符串。然后可以得到,1. 长度为 1 1 1的子串是美丽的。2. 长度为 2 2 2的子串,两个字符不同即可。3. 当长度等于 3 3 3时,我们将 a , b , c a,b,c a,b,c任意排列即可,而长度大于 3 3 3的串 只需要按顺序与前三个字符相同即可,即构造长度为 7 7 7的字符串,若前三个是 " a b c " "abc" "abc"则 s t r = " a b c a b c a " str = "abcabca" str="abcabca",若前三个是 " b a c " "bac" "bac"则 s t r = " b a c b a c b " str = "bacbacb" str="bacbacb"。而 a b c abc abc三个字母的所有排列只有6种
{
"abc","acb","bac","bca","cab","cba"};
现在知道完美的串的构造方法,再看问题, m m m次提问 m < = 2 e 5 , l < = r < = n m <= 2e5 ,l <= r <= n m<=2e5,l<=r<=n。我们尝试用暴力的方法,每次自己设定前三个字母 ,按顺序去排列,若与原字符串不符合花费+1,因为前三个的排列方式有6种,只需要枚举6次取最大值即可。但考虑到数据范围,每次对区间遍历的时间复杂度为 O ( n ) O(n) O(n) 而有 m m m次询问,总体复杂度为 O ( n ∗ m ) O(n*m) O(n∗m)显然是我们不能接受的,那么有什么加快的方式吗?
我们想到区间询问可以用前缀和来 O ( 1 ) O(1) O(1)查询。于是我们枚举6种开头的排列方式对整个字符串进行花费的求解 (枚举整个字符串的开头,对于我们询问的区间的开头6种方案也包括在内,同样可以在纸上略微构造可得),并以前缀和的方式记录,最后的时间复杂度 预处理: O ( 6 n ) O(6n) O(6n) + 查询 O ( 1 m ) O(1 m) O(1m)总复杂度: O ( n + m ) O(n + m) O(n+m)。
代码:
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 2e5 + 10;
int n,m;
char a[N];
char p[6][4] = {
"abc","acb","bac","bca","cab","cba"};//枚举6种方式
int sum[6][N];//前缀和
int main()
{
scanf("%d%d%s",&n,&m,a + 1);
for(int i=0;i<6;i++){
//预处理
for(int j=1;j<=n;j++)
{
if(a[j] != p[i][j % 3])sum[i][j] = 1;//虽然字符串以1开头方便前缀和计算,但也不影响取模排列,abc->bca整体右移一位
sum[i][j] += sum[i][j - 1];
}
}
while(m --)
{
int l,r;
scanf("%d%d",&l,&r);
int ans = r - l + 1;
for(int i=0;i<6;i++){
ans = min(ans , sum[i][r] - sum[i][l - 1]);
}
printf("%d\n",ans);
}
return 0;
}
边栏推荐
- 实践篇2:深度学习之----LetNet之tensorflow2的实现
- idea 引入包报错:Unable to provision, see the following errors
- Kotlin's JSON format parsing
- XTU OJ 1075 求最小公倍数
- 分门别类输入输出,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang基本数据类型和输入输出EP03
- OneNote 教程,如何在 OneNote 中检查拼写?
- Bluu Seafood launches first lab-grown fish products
- 解决gradle导包速度慢问题
- 兼容并蓄广纳百川,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang复合容器类型的声明和使用EP04
- Solve the problem of slow speed of gradle import package
猜你喜欢
随手记:laravel、updateOrCreate 和 updateOrInsert 的区别
iMeta | 深圳先进院戴磊组开发可同时提取共存菌株的组成和基因成分谱的菌株分析工具...
The new database is online | CnOpenData information transmission, software and information technology service industry basic information data of industrial and commercial registered enterprises
高数_复习_第3章:一元函数积分学
如何用WebSocket打造Web端IM即时通讯聊天
接口测试经典面试题:Session、cookie、token有什么区别?
用固态U盘让你的办公环境随身移动
Superman is coming!Flutter realizes full-screen power animation!
劳务派遣业务流程图
Float.parseFloat()的作用
随机推荐
Flask 教程 第十章:邮件支持
新库上线 | CnOpenDataA股上市公司基本信息数据
场外基金开户在手机办理安全吗?
跨域问题 什么时候出现跨域问题 如何解决跨域问题
Kotlin's JSON format parsing
WPF主窗体调用 User32的SetWindowPos 设置窗体置顶会导致与其他窗体抢夺焦点的问题
买股票安全吗 资金能取出来吗
LitJson使用中的一些问题
WPF主窗体调用 User32的SetWindowPos 设置窗体置顶会导致与其他窗体抢夺焦点的问题
Gradle简单到使用kotlin编写到常用命令
idea 引入包报错:Unable to provision, see the following errors
解决gradle导包速度慢问题
测试面试题锦集
Float.parseFloat()的作用
PyTorch入门(六):模型的训练套路
SQL-堆叠注入(含例题)
澳洲ABM创新模式将销售代理权给到个体,让利消费者
昇腾Ascend 随记 —— TensorFlow 模型迁移
Flask 教程 第三章:Web表单
Gradle is as simple as using kotlin to write common commands