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 + 定义状态取消后效性的更多相关文章

  1. Educational Codeforces Round 62 (Rated for Div. 2)

    A. Detective Book 题意:一个人读书  给出每一章埋的坑在第几页可以填完 . 一个人一天如果不填完坑他就会一直看 问几天能把这本书看完 思路:模拟一下 取一下过程中最大的坑的页数  如 ...

  2. 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 ...

  3. Educational Codeforces Round 63-D(基础DP)

    题目链接:https://codeforces.com/contest/1155/problem/D 题意:给定n个数,可以选择一段连续子段将其乘x,也可以不操作,求最大连续子段和. 思路:比赛时觉得 ...

  4. Educational Codeforces Round 62 Div. 2

    突然发现上一场edu忘记写了( A:签到. #include<iostream> #include<cstdio> #include<cmath> #include ...

  5. Educational Codeforces Round 62 (Rated for Div. 2) Solution

    最近省队前联考被杭二成七南外什么的吊锤得布星,拿一场Div. 2恢复信心 然后Div.2 Rk3.Div. 1+Div. 2 Rk9,rating大涨200引起舒适 现在的Div. 2都怎么了,最难题 ...

  6. Educational Codeforces Round 62

    A. Detective Book 代码: #include <bits/stdc++.h> using namespace std; ; int N; int a[maxn]; ; in ...

  7. 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 ...

  8. 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(\ ...

  9. Educational Codeforces Round 52F(树形DP,VECTOR)

    #include<bits/stdc++.h>using namespace std;int n,k;vector<int>son[1000007];int dp[100000 ...

随机推荐

  1. Genymotion 模拟器上网出现 net::ERR_NAME_NOT_RESOLVED

    Genymotion 模拟器在公司网络安装的,然后启动能正常上网,把笔记本带回家,网络变化了,再使用模拟器 上网显示: (net::ERR_NAME_NOT_RESOLVED) 各种百度,最后用如下方 ...

  2. RocketMq顺序消费

    部分内容出处   https://www.jianshu.com/p/453c6e7ff81c rocketmq内部有4个默认的队里,在发送消息时,同一组的消息需要按照顺序,发送到相应的mq中,同一组 ...

  3. Wannafly挑战赛14 C.可达性(tarjan缩点)

    题目描述 给出一个 0 ≤ N ≤ 105 点数.0 ≤ M ≤ 105 边数的有向图, 输出一个尽可能小的点集,使得从这些点出发能够到达任意一点,如果有多个这样的集合,输出这些集合升序排序后字典序最 ...

  4. 844. Backspace String Compare判断删除后的结果是否相等

    [抄题]: Given two strings S and T, return if they are equal when both are typed into empty text editor ...

  5. day 30 HTML

    HTML: 超文本标记语言(Hyper Text Markup Language) Html基本结构 <!DOCTYPE html> <html> <!-- 定义HTML ...

  6. java遍历当前会话所有Session

    //方法一:通过遍历的方法进行遍历 String FileName=""; HttpSession session=request.getSession();//获取session ...

  7. centos实现两种秒级任务的简单方法

    1.通过写shell脚本,死循环,守护进程运行 > vi /data/sec.sh #!/bin/bash while true do #写上自已的命令 echo "hello wor ...

  8. 一个命令查看mysql的所有配置(原创)

    在mysql的命令提示符下,执行下面一句话,查看mysql服务器的所有全局配置信息: mysql> show global variables; 得到: 上表的文本内容: "Varia ...

  9. c#tcp源端口号和目的端口怎么理解

    在一台机器上,一个进程对应一个端口.端口的作用就是用来唯一标识这个进程.源端口标识发起通信的那个进程,目的端口标识接受通信的那个进程.有了端口号,接受到报文后才能够知道将报文发送到哪个进程.

  10. 在电脑上查看小米手机连接wifi时保存的密码

    手机连接的wifi,想另一个手机也连上,密码忘了. 先备份手机的资料,然后将手机连上电脑,在SD卡上MIUI-backup-allbackup文件夹中, 找到刚才备份的文件夹 点进去找到WLAN设置. ...