Educational Codeforces Round 62 E 局部dp + 定义状态取消后效性
https://codeforces.com/contest/1140/problem/E
局部dp + 定义状态取消后效性
题意
给你一个某些位置可以改变的字符串,假如字符串存在回文子串,那么这个字符串就是坏的,问有多少好的串(n<=2e5)
题解
- 首先发现只需要保证\(s[i-2]!=s[i]\)(局部保证),就可以保证不存在回文子串
- 直接计算有多少个好的串(即不存在回文子串的情况)
- 分奇偶位考虑,因为假如奇偶位都合理,那么就不存在1,2,3,2,1这种情况,这个序列考虑奇数位是1,3,1,考虑偶数位是2,2,奇数位序列合理,但是偶数位序列不合理
- 将奇偶分别数位抽出来,那我们就得到一段一段\([A,-1,-1,...,-1,-1,B]\),A,B可能不存在,因为所有段符合乘法性质,所以我们可以在每一段上dp,最后乘起来就是答案
- 假设定义dp[i]为到第i位一共有多少种情况,那么转移就是dp[i]=dp[i-1]*(k-1),但是这样到最后一个-1的时候,不能保证和B的关系(有后效性,且只和B有关)
- 那么我们就定义状态为dp[i][0/1],分别表示当前这位和B[不同/相同]
- \(dp[i][0]=dp[i-1][0]*(k-2)+dp[i-1][1]*(k-1)\)
- \(dp[i][1]=dp[i-1][0]\)
- 分开讨论[A,-1,-1],[-1,-1,A]两种情况
处理
- 模拟[A,-1,-1,-1,A]的区间
for(int l=0;i<r;l=r+1){
r=l;
//用r扫
}
代码
#include<bits/stdc++.h>
#define MOD 998244353
using namespace std;
int n,i,x;
vector<int>A,B;
long long ans,dp[200005][2],k;
void chk(vector<int> A){
for(int i=1;i<A.size();i++){
if(A[i]==A[i-1]&&A[i]!=-1){cout<<0;exit(0);}
}
}
void sol(vector<int> A){
for(int l=0,r;l<A.size();l=r+1){
r=l;
if(A[r]!=-1)continue;
while(r<A.size()&&A[r]==-1)r++;
if(r==A.size()){
r--;
if(l==0)dp[l][0]=k;
else dp[l][0]=k-1;
for(int i=l+1;i<=r;i++)dp[i][0]=dp[i-1][0]*(k-1)%MOD;
}else{
if(l==0){
dp[l][0]=k-1;dp[l][1]=1;
}else{
int a=A[l-1],b=A[r];
if(a==b){
dp[l][0]=k-1;
dp[l][1]=0;
}else{
dp[l][0]=k-2;
dp[l][1]=1;
}
}
r--;
for(int i=l+1;i<=r;i++){
dp[i][0]=(dp[i-1][0]*(k-2)%MOD+dp[i-1][1]*(k-1)%MOD)%MOD;
dp[i][1]=dp[i-1][0]%MOD;
}
}
ans=ans*dp[r][0]%MOD;
}
}
int main(){
cin>>n>>k;
for(int i=0;i<n;i++){
scanf("%d",&x);
if(i&1)A.push_back(x);
else B.push_back(x);
}
ans=1;
chk(A);chk(B);
sol(A);sol(B);
cout<<ans;
}
Educational Codeforces Round 62 E 局部dp + 定义状态取消后效性的更多相关文章
- Educational Codeforces Round 62 (Rated for Div. 2)
A. Detective Book 题意:一个人读书 给出每一章埋的坑在第几页可以填完 . 一个人一天如果不填完坑他就会一直看 问几天能把这本书看完 思路:模拟一下 取一下过程中最大的坑的页数 如 ...
- Educational Codeforces Round 62 (Rated for Div. 2)E(染色DP,构造,思维,组合数学)
#include<bits/stdc++.h>using namespace std;const long long mod=998244353;long long f[200007][2 ...
- Educational Codeforces Round 63-D(基础DP)
题目链接:https://codeforces.com/contest/1155/problem/D 题意:给定n个数,可以选择一段连续子段将其乘x,也可以不操作,求最大连续子段和. 思路:比赛时觉得 ...
- Educational Codeforces Round 62 Div. 2
突然发现上一场edu忘记写了( A:签到. #include<iostream> #include<cstdio> #include<cmath> #include ...
- Educational Codeforces Round 62 (Rated for Div. 2) Solution
最近省队前联考被杭二成七南外什么的吊锤得布星,拿一场Div. 2恢复信心 然后Div.2 Rk3.Div. 1+Div. 2 Rk9,rating大涨200引起舒适 现在的Div. 2都怎么了,最难题 ...
- Educational Codeforces Round 62
A. Detective Book 代码: #include <bits/stdc++.h> using namespace std; ; int N; int a[maxn]; ; in ...
- C. Playlist Educational Codeforces Round 62 (Rated for Div. 2) 贪心+优先队列
C. Playlist time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...
- Educational Codeforces Round 62 (Rated for Div. 2) C 贪心 + 优先队列 + 反向处理
https://codeforces.com/contest/1140/problem/C 题意 每首歌有\(t_i\)和\(b_i\)两个值,最多挑选m首歌,使得sum(\(t_i\))*min(\ ...
- Educational Codeforces Round 52F(树形DP,VECTOR)
#include<bits/stdc++.h>using namespace std;int n,k;vector<int>son[1000007];int dp[100000 ...
随机推荐
- RocketMq --consumer自动实现负载均衡
这边使用一个producer和两个consumer是实现负载均衡. 看一下代码示例 package com.alibaba.rocketmq.example.message.model; import ...
- 安装vCenter server 6.0
注意,5.5的还可以直接把iso里的ova直接导入为模板,6.0之后的要拉到Windows下安装. 总路线 ESXI是服务器系统,用vsphere client连接,在client里新建一个虚拟机为W ...
- swift - 本地通知2 - 啰嗦版
1. import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var windo ...
- swift - scrollview 判断左右移动, 以及上下两个view联动
核心代码 1. 2. 3. 界面代码VFL /* 浏览作品view*/ import UIKit /** * 图片浏览器(大图和缩略图) */ class JYBrowseWorksView: UIV ...
- Java构建指定大小文件
Java快速创建指定大小的文件,最多的解决办法就是循环向文件里面入固定大小的空字节,但是这种方式构建大文件性能比较低下,因此有这样两种方式可供参考: Java有一个类:FileChannel,查阅AP ...
- tomcat配置的环境变量catalina.home和catalina.base 区别
本篇文章原创地址为:http://blog.csdn.net/you23hai45/article/details/27726147 这两个属性仅在你需要安装多个Tomcat实例而不想安装多个软件备份 ...
- http协议的学习
TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据.
- sourceTree git的一些命令
经常使用的三个命令 1.添加修改过的文件到缓冲区 git add. 2.commit到本地 git commit -am ' 更改描述' 3.如果是多人开发的话,中间可能会有别人先提交的这是就需要先把 ...
- 使用PHP来简单的创建一个RPC服务
RPC全称为Remote Procedure Call,翻译过来为"远程过程调用".主要应用于不同的系统之间的远程通信和相互调用. 比如有两个系统,一个是PHP写的,一个是JAVA ...
- VSCode一直弹框错误Linter pylint is not installed
确保已经安装Python编译环境 点击下图位置(这个是我已经安装过后的文字,原本显示“搜索Python”字样) 点击后显示如下,点击安装 然后出现一大坨命令 最终出现“Successfully ins ...