D - Avoid K Palindrome

news/2024/10/6 3:00:21/文章来源:https://www.cnblogs.com/lightsong/p/18288798

D - Avoid K Palindrome

https://atcoder.jp/contests/abc359/tasks/abc359_d

 

思路

https://atcoder.jp/contests/abc359/submissions/54822869

状压DP

以 K二进制位表示 K字符串(由AB组成), 判断并记录是否为回文。

dp[i][j]  -- 前i个字符,如果以j(k字符状压表示)结尾,是good string的可能字符串个数。

初始化前K位dp

计算后续dp。

code

https://atcoder.jp/contests/abc359/submissions/55346351

typedef long long ll;
const ll mod = 998244353;ll n, k;
string s;const ll nsize = 1005;
const ll kstatesize = 1<<10 + 5;
bool mirror[kstatesize];ll dp[nsize][kstatesize];/*kseq is represented by bitseq of k bit length10101011111111this function is to check if it is of mirror structuremirror structure has central symmetry, for example10111011
*/
bool checkmirror(ll kseq){/*iterate from 0 positon to half position k>>11111111111111111111111111111l                  r*/for(int i=0; i<(k>>1); i++){ll l = i;ll r = k - i -1;ll lbit = (kseq>>l)&1;ll rbit = (kseq>>r)&1;if (lbit != rbit){return false;}}return true;
}int main()
{cin >> n >> k;cin >> s;for(int i=0; i<(1<<k); i++){mirror[i] = checkmirror(i);}/*initialize the first k seq of dp*/for(int i=0; i<(1<<k); i++){// only non-mirror seq takes effectif (mirror[i]){continue;}/*suppose the first k seq follow the i caseincrease dp*/dp[k-1][i]++;/*then detect if any break with i case,if yes, decrease dp*/for(int j=0; j<k; j++){/*in i case, for each bit,0    --    A1   --  B*/ll jbitpos = k - j - 1;ll jbit = (i>>jbitpos)&1;if (s[j]=='A' && jbit==1){dp[k-1][i]--;break;}if (s[j]=='B' && jbit==0){dp[k-1][i]--;break;}}
//        cout<<dp[k-1][i];
    }/*now iterate from k to n-1 to calculate the following dp*/for(int i=k; i<n; i++){/*iterate each non-mirror cases*/for(int j=0; j<(1<<k); j++){// as of this case j, the previous state i-1 is not a good string// i.e. dp == 0// for the new added char of i index, the new string is still not a good string// so skipif (dp[i-1][j] == 0){continue;}// if the new added char of i index is not A,// the possible value is B or ?// let's make the possible state transferif (s[i]!='A'){// newk is appended by B, and removed the left-most charll newk = ((j<<1)|1)&((1<<k)-1);
//                cout<<newk;// if newk is not mirror, the new string is a good string// newk is not mirror, make state stranferif (!mirror[newk]){dp[i][newk] = (dp[i][newk] + dp[i-1][j]) % mod;}}// if the new added char of i index is not B,// the possible value is A or ?// let's make the possible state transferif (s[i]!='B'){// newk is appended by A, and removed the left-most charll newk = (j<<1)&((1<<k)-1);
//                cout<<newk;// if newk is not mirror, the new string is a good string// newk is not mirror, make state stranferif (!mirror[newk]){dp[i][newk] = (dp[i][newk] + dp[i-1][j]) % mod;}}}
//        for(int j=0;j<(1<<k);j++)cout<<dp[i][j];
//        cout<<'\n';
    }// now we get dp[n-1],// let calculate total number of all statesll ans = 0;for(int i=0; i<(1<<k); i++){ans = (ans + dp[n-1][i]) % mod;
//        cout<<dp[n-1][i];
    }cout << ans << endl;return 0;
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 提权-SUID/SGID_2

本文通过 Google 翻译 SUID | SGID Part-2 – Linux Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充。导航0 前言 1 上文回顾 2 枚举自定义 SUID 二进制文件 3 利用 SUID 二进制文件 – 共享对象注入3.1 使用 Strings …

配置与管理squid代理服务器

应用背景如下图所示, 公司用squid作代理服务器,代理服务器内网IP地址为192.168.200.1,外网IP为192.168.200.3公司内网所用IP地址段为192.168.200.0/24,并且想用8080作为代理端口。1: 配置非透明代理 1.1 、配置主机网络 准备三台Linux主机,第一台为外网主机名为www,网卡…

RedHat7.4—配置常规网络

配置主机名 把主机名修改为hyborn 方法一、使用nmtui修改主机名 需要管理员权限运行su -root输入root密码后进入管理员模式 运行nmtui通过上下左右选择菜单栏回车选择,进入设置系统名即可设置确定后退出 运行hostnamectl status 命令查看主机名,查看到的主机名,即可以看到St…

RedHat7.4—配置远程管理Linux服务器

公司的Linux服务器需24小时不间断工作,维护工程师希望通过设置能远程管理和维护服务器。要求通过SSH及VNC远程管理,实现如下配置需求:可以通过SSH服务访问远程主机,可以使用证书登录远程主机,不需要输入远程主机的用户名和密码 可以使用VNC服务访问远程主机,使用图形界面…

Ping 不通 虚拟机

Ping 不通虚拟机 更换位置后,IP不会动态变化,切换网络配置信息来解决

Yet Another Permutation Constructive

这道题目不用写,因为必须要求用kotlin语言 讲一下我做这道题目的过程 我最开始正着想,如果\(k\)比较大的话,我们就想一次删的数少一点,所以考虑一次操作有哪些数被保留,于是我们发现,原序列的极大值点会被保留,于是一次操作被保留的数最多的情况就是如下的波浪形:然后我…

ComfyUI进阶篇:ComfyUI核心节点(三)

ComfyUI核心节点(三)前言:学习ComfyUI是一场持久战。当你掌握了ComfyUI的安装和运行之后,会发现大量五花八门的节点。面对各种各样的工作流和复杂的节点种类,可能会让人感到不知所措。在这篇文章中,我们将用通俗易懂的语言对ComfyUI的核心节点进行系统梳理,并详细解释每…

版本控制系统

GIT 分布式版本控制系统 分布式版本控制,没有中央服务器的概念,每个人都有自己的版本库,因此每个人在工作时候,不需要联网,版本库本地即可管理。 既然每个人都是一个完整的版本库,同事之间如果需要协作开发,就需要找一个用于“交换文件”的中央服务器,这个服务器不存在…

2024-07-07 如何把ipad当作windows副屏使用 ==》 通过软件dute display和数据线连接

windows:进入dutedisplay官网https://www.duetdisplay.com/zh#download,下载并安装 ipad:在苹果应用商店搜索dutedisplay,选中并下载注意:你需要注册一个dutedisplay账号,才能登录该软件,它是付费的,so,我看到付费我就放弃了。 如果,你给钱了,那么,接下来我也不知道…

AtCoder Beginner Contest 361

AtCoder Beginner Contest 361 A - Insert给定一个长度为\(N\)的序列\(A\),现在希望将数字\(X\)插入到序列的第\(K\)个数字后面,变成一个新的序列\(B\)。输出序列\(B\)。 \(K,N,A_i,X\le 100\)模拟题。先读入\(N,K,X\)。接着在读入\(A\)的过程中一遍读入一遍输出,如果读到了…

2024暑假第一周总结

JAVA开发环境搭建和HelloWorld编译 1、JDK安装(java开发环境安装) 更改环境变量 Path环境变量 Path环境变量用于记住程序路径,方面在命令行窗口的任意目录启动程序 老版本的jdk需要进行配置环境变量,将jdk和bin包路径复制,新建path路径 Java_home环境变量 告诉操作系统JDK…

前端取唯一标识 UUID

// 使用工具 fingerprintjs 可以简单取到UUID1 <!DOCTYPE html>2 <html lang="en">3 4 <head>5 <meta charset="UTF-8">6 <meta http-equiv="X-UA-Compatible" content="IE=edge">7 <meta nam…