Codeforces Round 961 D. Cases 【SOS DP、思维】

news2024/11/28 11:47:31

D. Cases

1
2

题意

有一个长度为 n n n 且仅由前 c c c 个大写字母组成的字符串,问最少选取多少种字母为每个单词的结尾,使得每个单词长度不超过 k k k

思路

首先注意到最后一个字母一定要选择,接下来我们给出一个断言:如果一个字母被选上了,那么对于这个字母在字符串中所有出现的位置,用这些位置作为结尾是最优的
这是因为如果最优的答案存在一个单词横跨了所选的这个字母,因为这个单词长度本身小于等于 k k k,所以我们把他划分成两段,一段以所选的字母结尾,另一段以原先单词自己的字母结尾,这样子并不会使得答案更劣,所以我们一旦选择了某个字母,一定是选择其在字符串中出现的所有位置

进一步观察发现:对于每 k k k连续的字符,我们一定至少选择 1 1 1 个字母作为结尾
简化一下单词长度不超过 k k k 的这个条件,我们如果对于每一个长度恰好为 k k k 的一个窗口,把这个窗口里所有出现的字母记录一下,形成一个 m a s k mask mask,那么对于所有的 O ( n ) O(n) O(n) m a s k mask mask,我们等价于要满足每个 m a s k mask mask 都至少有 1 1 1 位被选作最终的答案集合

至此,问题便转化为了:对于 O ( n ) O(n) O(n) m a s k mask mask,我们要选择一个含 1 1 1 数量最少的,且与每个 m a s k mask mask 有交,且 a n s ans ans 必须包含最后一个字母

直接枚举 a n s ans ans 并与 O ( n ) O(n) O(n) m a s k mask mask 求交太慢,我们可以先把全部不合法的 a n s ans ans 筛出来,再从剩下的所有合法的 a n s ans ans 中选一个最少的即可

接下来我们将 O ( n ) O(n) O(n) m a s k mask mask 放入数组 a a a 中,注意到一个答案 b b b 如果不合法,那么一定有 b    &    a i = 0 b \; \& \; a_i = 0 b&ai=0,即一定存在至少一个 m a s k mask mask,使得 b b b 与其没有任何的交集,那么这个 b b b 不合法
剩下的一定是合法的。
注意到: a    & b    = 0 ⇔ b ⊂ a ˜ ( a 的补集 ) a \; \& b \; = 0 \Lrarr b \subset \~a (a 的补集) a&b=0ba˜(a的补集),即 b b b a a a 的补集的子集
现在我们有了 O ( n ) O(n) O(n) 个母集 a i a_i ai,我们需要筛出其所有的子集 b ⊂ a i b \subset a_i bai,这个过程我们可以使用 S O S    D P SOS \; DP SOSDP

时间复杂度: O ( c n + c 2 c ) O(cn + c2^c) O(cn+c2c)

#include<bits/stdc++.h>
#define fore(i,l,r)	for(int i=(int)(l);i<(int)(r);++i)
#define fi first
#define se second
#define endl '\n'
#define ull unsigned long long
#define ALL(v) v.begin(), v.end()
#define Debug(x, ed) std::cerr << #x << " = " << x << ed;

const int INF=0x3f3f3f3f;
const long long INFLL=1e18;

typedef long long ll;

int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    int t;
    std::cin >> t;
    while(t--){
        int n, c, k;
        std::cin >> n >> c >> k;
        std::string s;
        std::cin >> s;
        s = '0' + s;
        std::vector<std::vector<int>> sum(n + 1, std::vector<int>(26, 0));
        std::vector<int> a;
        fore(i, 1, n + 1){
            int ch = s[i] - 'A';
            fore(j, 0, c) sum[i][j] = sum[i - 1][j];
            ++sum[i][ch];
            if(i >= k){
                int mask = 0;
                fore(j, 0, c)
                    if(sum[i][j] - sum[i - k][j])
                        mask |= 1 << j;
                a.push_back(mask);
            }
        }
        for(int& mask : a) mask = (~mask & ((1 << c) - 1));

        std::vector<int> dp(1 << c, 1);
        for(auto mask : a) dp[mask] = 0;
        fore(i, 0, c)
            fore(mask, 0, 1 << c)
                if(!(mask >> i & 1))
                    dp[mask] &= dp[mask ^ (1 << i)];
        
        int last = s.back() - 'A';
        int ans = c;
        fore(mask, 0, 1 << c)
            if(dp[mask] && (mask >> last & 1))
                ans = std::min(ans, __builtin_popcount(mask));

        std::cout << ans << endl;
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2060312.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Fx - day3 - 沙盒/更改集/互联更改集/配置包

Fxiaoke - day3 - 沙盒/更改集/互联更改集/配置包 学习目标&#xff1a;熟悉 沙盒&#xff0c;更改集&#xff0c;配置包&#xff0c;互联更改集 的概念以及使用场景 0、前言 沙盒理解 很多时候我们可能需要一个沙盒环境&#xff0c;什么是沙盒环境&#xff1f; 沙盒环境&…

如何打造Java SpringBoot私房菜定制上门服务系统,实现个性化餐饮体验?

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

惠海H4312 dcdc同步整流降压恒压IC 30V 40V转3.3V/5V/12V小体积大电流单片机供电

1.产品描述 H4312是一种内置30V耐压MOS&#xff0c;并且能够实现精确恒压以及恒流的同步降压型 DC-DC 转换器: 支持 3.1A 持续输出电流输出电压可调&#xff0c;最大可支持 100%占空比;通过调节FB 端口的分压电阻&#xff0c;可以输出2.5V到 24V的稳定电压。 H4312 采用高端…

【脏数据 bug 解决】ValueError: mean must have 1 elements if it is an iterable, got 3

问题描述&#xff1a; 在训练模型的过程中&#xff0c;出现 clip_image_processor 无法处理数据的问题&#xff0c;说明数据集中很可能出现了脏数据。本文使用的数据为 LAION-Aesthetics-V2-6.5plus&#xff0c;从 https://dagshub.com/DagsHub-Datasets/LAION-Aesthetics-V2-…

21、springboot3 vue3开发平台-前端-自定义树形穿梭框,用于角色权限分配

文章目录 1. 使用原因2. 实现3. 使用 1. 使用原因 elemenutplus 有穿梭框&#xff0c;但是不支持树状数据的操作&#xff0c;所以这里自定义树状穿梭框&#xff0c;用于菜单权限分配&#xff0c; 如下&#xff1a; 2. 实现 这里主要是将菜单列表树解构后添加修改组合再恢复…

STM32H7双路CAN踩坑记录

STM32H7双路CAN踩坑记录 目录 STM32H7双路CAN踩坑记录1 问题描述2 原因分析3 解决办法4 CAN配置参考代码 1 问题描述 STM32的CAN1和CAN2无法同时使用。 注&#xff1a;MCU使用的是STM32H743&#xff0c;其他型号不确定是否一样&#xff0c;本文只以STM32H743举例说明。 2 原因…

odoo17 网站内容存在哪了

odoo17 网站内容存在哪了 查数据库内容&#xff0c;却没找到 没理解这些内容到底存在了哪里呢

图文详解ThreadLocal:原理、结构与内存泄漏解析

目录 一.什么是ThreadLocal 二.ThreadLocal的内部结构 三.ThreadLocal带来的内存泄露问题 ▐ key强引用 ▐ key弱引用 总结 一.什么是ThreadLocal 在Java中&#xff0c;ThreadLocal 类提供了一种方式&#xff0c;使得每个线程可以独立地持有自己的变量副本&#xff0c;而…

「黑神话:悟空」狂销 15 亿!高清游戏录制神器助你称霸

短短一天时间 《黑神话&#xff1a;悟空》在Steam上已售出超过300万份 加上wegame、epic和ps平台 目前总销量超过450万份&#xff0c;总销售额超过15亿元。 根据Steam平台实时数据 8月20日晚间20点30分 该平台《黑神话&#xff1a;悟空》同时在线玩家人数突破200万 达到2…

手机怎么把百度网盘里的文件打印出来?

在日常生活中&#xff0c;我们常常需要打印各种文档&#xff0c;比如合同、报告或是学习资料。有时这些文件存储在网盘中&#xff0c;比如百度网盘&#xff0c;这时候如果能够直接从网盘中打印出来&#xff0c;将会极大地提高效率。今天&#xff0c;就让我们来了解一下如何使用…

PL3366C 用0.1+的芯片做过认证5V1A电源

PL3366C是一款原边反激式5W开关电源芯片恒流/恒压电源。PL3366C高度集成了功率开关&#xff0c;无需光耦以及次级控制电路&#xff0c;PL3366C的复合模式的应用使芯片能够实现低静态功耗、低音频噪音、高效率。满载时PL3366C工作在PFM模式&#xff0c;随着负载降低&#xff0c;…

I2C学习:上拉电阻选取

一&#xff0e;I2C简介 I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。I2C总线在使用时&#xff0c;需要接上拉电阻&#xff0c;这是因为I2C接口是开漏输出&#xff0c;如图1所示。 图1 I2C开漏输出 I2C有5种速度模式&#xff1a;标准&#xff08;100KHz&am…

日志文件的理解

前言 说实在话我一直对于日志不太理解&#xff0c;感觉这词说的这么高大上&#xff0c;不好理解&#xff0c;甚至还有点畏惧这个东西&#xff0c;所以专门去研究了下&#xff0c;最后发现这家伙不就是输出信息嘛&#xff0c;就像C语言中printf输出的信息&#xff0c;C中cout输…

【电子通识】开关上的“|”和“0”到底哪个是开?哪个是关?

有的电器、灯具和插座上带有电源开关&#xff0c;开关上会出现“|”和“O”两个符号。如下所示船型开关上就有“|”和“0”。 也有开关用ON/OFF代表开闭。 如果只看符号判断“|”和“O”到底代表什么含义呢&#xff1f;你又能分清哪个是电路连通&#xff0c;哪个是电路断开…

05.震动控制继电器开关

首先先知道控制器的原理 通过继电器来控制电路&#xff0c;比如智能插座&#xff0c;比如 220V 的灯&#xff0c;比如我们项目不带开关的傻瓜式报警器 当设置继电器为低电平触发时&#xff0c; STC89C52RC 的 IO 输出 低电平&#xff0c;就会导致 COM口和NO口闭合 &#xff0c…

LearnOpenGL——点光源阴影笔记

LearnOpenGL——点光源阴影笔记 点光源阴影一、生成深度立方体贴图1. 创建立方体贴图2. 光空间的变换3. 深度着色器 二、万向阴影贴图三、PCF 点光源阴影 点光阴影&#xff08;也叫万向阴影贴图&#xff08;Omnidirectional Shadow Maps&#xff0c;OSM&#xff09;&#xff0…

【乐吾乐大屏可视化组态编辑器】动画按顺序播放

动画按顺序播放 在线使用&#xff1a;https://v.le5le.com/ 如案例所示&#xff0c;通过连线去串联一组动画图元&#xff0c;动画按照顺序向后执行。 ① 首先给每个图元都配置动画&#xff0c;注意这里的动画播放次数一定要配置有限个&#xff08;这里配置都是1次&#xff0…

AI在医学领域:FEDMEKI平台实现在隐私约束下将医学知识整合到基础模型

基础模型已在众多领域掀起了一场革命性的变革&#xff0c;它们在处理多样化模态和复杂任务方面展现出了卓越的能力。以GPT-3和LLaMA为例&#xff0c;这些模型在众多应用场景中均表现出色。其成功的核心在于接触并学习海量的训练数据&#xff0c;从而深入洞察不同领域。借助这些…

【python与java的区别-04(文件流)】

一、文件和目录的操作 1、IO流&#xff08;Stream&#xff09; 通过“流”的形式允许计算机程序使用相同的方式来访问不同的流入/流出源。Stream是从起源&#xff08;source&#xff09;到接收(sink)的有序数据。我们把输入/输出源对比成“水桶”&#xff0c;那么流就是“管道…

企业给排水乙级资质续期:人才储备与补充计划

企业给排水乙级资质续期过程中&#xff0c;人才储备与补充计划是至关重要的环节。以下是一个详细的人才储备与补充计划&#xff0c;旨在帮助企业顺利应对资质续期挑战&#xff1a; 一、人才储备计划 1. 提前规划与预测 政策分析&#xff1a;密切关注住建部门或相关权威机构发…