状压DP,abc359_d - Avoid K Palindrome

news2024/11/25 1:04:57

一、题目

1、题目描述

2、输入输出

2.1输入

2.2输出

3、原题链接

D - Avoid K Palindrome


二、解题报告

1、思路分析

数据量:N:1000,K:10

提示我们状态压缩

我们发现长度为K的字符串,我们可以用0表示A,1表示B,用10位二进制就能表示

我们定义状态f(i, j)为 考虑到第 i 个字母,右侧长度 k - 1子串二进制表示为 j 的合法字符串数目

那么我们我们将s[i] 和 j 拼接后,我们可以轻松判断是否回文,这个可以预处理

那么如何转移?

拼接后为t,那么 f[i][j] += f[i - 1][t & ((1 << (k - 1)) - 1)]

状态不重不漏,O(1)转移

2、复杂度

时间复杂度: O(n 2^k)空间复杂度:O(n 2^k)

3、代码详解

 ​
#include <bits/stdc++.h>
// #include <ranges>
// #define DEBUG
using i64 = long long;
using u32 = unsigned;
using u64 = unsigned long long;
constexpr int inf32 = 1E9 + 7;
constexpr i64 inf64 = 1E18 + 7;
constexpr double eps = 1e-9;

constexpr int P = 998244353;

void solve() {
    int n, k;
    std::cin >> n >> k;
    
    std::vector<int> ispar(1 << k);
    for (int i = 0, ed = 1 << k; i < ed; ++ i) {
        ispar[i] = true;
        for (int j = 0; j < k / 2; ++ j)
            if ((i >> j & 1) != (i >> (k - j - 1) & 1)) {
                ispar[i] = false;
                break;
            }
    }

    std::string s;
    std::cin >> s;

    int msk = (1 << (k - 1)) - 1;
    std::vector<std::vector<int>> f(n + 1, std::vector<int>(msk + 1));
    f[0].assign(msk + 1, 1);

    
    for (int i = 0; i < n; ++ i) {
        for (int j = 0; j <= msk; ++ j) {
            for (int b = 0; b < 2; ++ b) {
                if (s[i] != '?' && b != (s[i] - 'A'))
                    continue;
                int t = j << 1 | b;

                if (i > n - k || !ispar[t])
                    f[i + 1][j] = (1LL * f[i + 1][j] + f[i][t & msk]) % P;
            }
        }
    }

    std::cout << f[n][0];
}


auto FIO = []{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    return 0;
} ();

int main() {
    #ifdef DEBUG
        freopen("in.txt", "r", stdin);
        freopen("out.txt", "w", stdout);
    #endif     

    int t = 1;
    // std::cin >> t;
    while (t --)
        solve();

    return 0;
}

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

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

相关文章

vue2项目如何引入element组件库以及如何使用element组件库

目录 一、创建项目二、进入项目1、先进入项目&#xff0c;![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a1ce9d928fdb4b5d85e6612f458a33db.png)2、路径栏输入cmd&#xff0c;然后回车3、输入code . &#xff0c;然后回车 三、项目启动1、查看启动指令2、启动项目 …

VMwave安装Ubuntu20.04超详细图文教程(附VMwave17.5安装包)

VMwave安装 Ubuntu20.04 超详细图文教程 一、VMwave安装 官网下载 网盘下载 二、Ubuntu下载 三、Ubuntu20.04安装 四、安装VMwave tools 五、更改Ubuntu软件源 注&#xff1a;写教程的时候博主用的是VMware Workstation pro 17(VM17.5) 一、VMwave安装 以下我提供两…

常见中间件漏洞(一、Tomcat合集)

目录 一&#xff0e;Tomcat Tomcat介绍 1.1 CVE-2017-12615 影响范围 环境搭建 漏洞复现 1.2 后台弱口令部署war包 漏洞原理 影响版本 环境搭建 1.3 CVE-2020-1938 漏洞原理 影响版本 环境搭建 漏洞复现 一&#xff0e;Tomcat Tomcat介绍 tomcat是一个开源而且…

clion开发stm32f4系列(一)————移植rt-thread os系统

前言 本次使用的rt-thread的版本为5.0.2基于rt-thread sudio生成的源码进行拷贝和修改工程基于上次创建工程的项目进行修改。本次工程只是用了serial和pin组件,其他后面用到再进行添加 拷贝rt-thread源码库 通过CMakeLists来进行管理 顶级(rt-thread目录) cmake_minimum_req…

Tomcat常见漏洞复现

Tomcat介绍 tomcat是一个开源而且免费的jsp服务器&#xff0c;默认端口:8080&#xff0c;属于轻量级应用服务器。它可以实现JavaWeb程序的装载&#xff0c;是配置JSP(Java Server Page)和JAVA系统必备的一款环境。在历史上也披露出来了很多的漏洞&#xff0c;这里我们讲几个经典…

中国区域创新能力评价报告数据(2001-2023年)

《中国区城创新能力评价报告》是以中国区域创新体系建设为主题的综合性、连续性的年度研究报告。以区域创新体系理论为指导&#xff0c;利用大量的统计数据&#xff0c;综合、客观及动态地给出各省市创新能力的排名与分析。 一、数据介绍 数据名称&#xff1a;中国区域创新能力…

文件夹内鼠标右键没有git bash here?

文件夹内鼠标右键没有git bash here? 如何解决&#xff0c;只需要三步 1、window 搜索git 2、进入git bash 3、输入文件路径&#xff0c;&#xff08;路径为反斜杠/&#xff09; 例如&#xff1a; D:/Desktop/photo

设计模式的概念

设计模式主要分为三类&#xff1a;创建类的设计模式、结构型设计模式、行为型设计模式。 创建类的设计模式&#xff1a;简单工厂&#xff0c;工厂模式&#xff0c;抽象工厂&#xff0c;建造者&#xff0c;单例&#xff0c;原型 结构型设计模式&#xff1a;代理模式、享元模式 行…

国密SM4算法进行数据的加密、签名和验签、解密

文章目录 前言一、SM4算法介绍二、生成128位密钥工具类三、SM4Util工具类四、测试示例 前言 本文介绍了SM4算法的基本概念、安全性以及在Java中的应用&#xff0c;包括生成16字节密钥、加密、解密、签名和验签的过程&#xff0c;展示了如何在实际开发中使用SM4算法进行信息安全…

enq: HW - contention事件来啦

业务系统反应数据库慢&#xff0c;根据时间查看awr报告。 先看一眼事件名称 HW enqueue 用于序列化超出段高水位线的空间分配。如果同时向对象添加大量数据&#xff0c;则多个进程可能同时尝试在高水位线上方分配空间&#xff0c;从而导致争用。 既然是控制资源并发的enq&…

WiFi Analyzer:你的开源WIFI管家!【送源码】

无论是在家里还是在公司&#xff0c;手机连接 WiFi 时&#xff0c;总是会出现 WiFi 信号比较弱&#xff0c;网速变慢的情况。如何检测 WiFi 信号的情况呢&#xff1f;今天给大家推荐一个开源项目——WiFi Analyzer。 项目简介 WiFi Analyzer 是一个开源的 Android 应用程序&a…

母带混音插件-Musik Hack Master Plan 1.59 WiN-MAC,长期更新持续有效

Musik Hack Master Plan 1.59 WiN-MAC 一款专业的音频母带制作流程&#xff0c;只需简单的控制就能制作出适合发布的母带&#xff1a; 水晶般清晰的响度、丰富的模拟饱和度、相位一致的成像、物理磁带模拟&#xff0c;以及修复和监听混音的额外工具。 一。Musik Hack Master P…

在 PhpStorm 中为 .java 文件启用语法高亮,需要正确配置文件类型和关联语言。

点击访问我的技术博客https://ai.weoknow.comhttps://ai.weoknow.com 因为我同时使用java和php混编所以在一个项目中如果同时打开IntelliJ IDEA和PhpStorm不符合我完美主义的本性。 捣鼓了一下搞定了 1. 添加文件类型关联 将 .java 文件与 Java 语言支持关联&#xff1a; …

新160个crackme - 023-TraceMe

运行分析 需破解用户名和序列号 PE分析 C程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida打开&#xff0c;由main函数向下分析&#xff0c;找到DialogFunc函数&#xff0c;并找到关键判断函数sub_401340 进入sub_401340函数&#xff0c;发现算法 发现byte_405…

xxl-job源码学习笔记

文章目录 一、简介二、下载源码三、模块介绍四、源码解析4.1、调度中心启动流程&#xff08;xxl-job-admin&#xff09;4.1.1、JobTriggerPoolHelper&#xff08;触发任务执行的核心组件&#xff09;4.1.2、JobRegistryHelper&#xff08;维护和更新调度中心与执行器之间的注册…

常见中间件漏洞(四、Apache合集)

目录 四、Apache 4.1 CVE-2021-41773 漏洞简介 影响版本 环境搭建 漏洞复现 四、Apache 4.1 CVE-2021-41773 Apache HTTP Server 路径穿越漏洞 漏洞简介 该漏洞是由于Apache HTTP Server 2.4.49版本存在目录穿越漏洞,在路径穿越目录<Directory/>Require all gra…

Spring Boot 依赖之 lombok的@Data注解

Spring Boot 依赖之 lombok的Data注解 编译之后的代码 Java源代码 引入lombok 一、创建 Spring Boot 项目 启动 IntelliJ IDEA&#xff0c;点击 File -> New -> Project...在新项目对话框中&#xff0c;选择 Spring Initializr&#xff0c;点击 Next配置 Spring Ini…

RF放大器(传输线+终止传输线+奥品电路中常见问题+调谐放大器)

2024-8-6&#xff0c;星期二&#xff0c;22:57&#xff0c;天气&#xff1a;晴&#xff0c;心情&#xff1a;晴。下班抽出点时间看看书&#xff0c;话不多说&#xff0c;学习开始啦。 今日继续学习模电自选教材的第六章&#xff0c;多级放大器、RF放大器和功率放大器。主要学习…

机械学习—零基础学习日志(高数23——无穷小运算)

零基础为了学人工智能&#xff0c;真的开始复习高数 这段时间&#xff0c;把张宇老师讲解考研的第一部分基本全部学习完毕了。 这里把第一部分的内容最后汇总一下。 无穷小运算——吸收律 这里展示一些无穷小的具体计算思路 无穷小运算——计算方法 泰勒展开的原则 夹逼准则…

C语言程序设计-[6] if语句分支结构

if语句分支结构有三种形式&#xff0c;分别按照语句形式、流程图表示、示例的步骤进行讲解。 1、if语句的一般形式 ——简单if语句 语句形式&#xff1a;if(表达式) 语句1&#xff1b; 执行过程&#xff1a; 如果表达式值为“真”,执行该语句1&#xff0c;然后执行if的下一…