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. 【mysql】分区表

    分区表是什么? 分区表可以按照事先创建的规则,对mysql的记录进行分组,每一个组具有一个独立的逻辑单元来存储该组的数据.典型的如:按照创建时间的年份分组,按照id的顺序分组(每1000万条数据分一个 ...

  2. C# 创建WebService的简单示例

    工具Visual Studio 2013 1.创建一个空的Web应用程序. 2.鼠标右击项目,添加->新建项 选择Web服务(ASMX),点击添加.一个简单的webservice就创建完成了.

  3. 点线特征双目视觉SLAM---暑期笔记

    1.由于以后可能研究有关基于特征方面的SLAM研究,所以近期看了一篇文章[基于点线综合特征的双目视觉SLAM方法--谢晓佳],由于之前对SLAM的模块比较模糊,所以认真阅读了此论文,并对主要的3个线程 ...

  4. C语言的那些事

    变量的存数类型: 1:静态变量:凡是在代码任何快之外声明的变量总是存储在静态内存内,也就是不属于堆栈的内存. 对于这类变量.你无法对它们制指定存储类型. 2:存储于堆栈中,称为自动变量.当程序执行到声 ...

  5. c# 使用ssh.net 上传文件

    在ssh.net 客户端实例下无法普通用户切换到su root  超级用户,原因是tty 的不支持,具体原因未查, 连接时用超级用户,问题解决 使用ssh.net  能实现远程命令,  使用其中的sf ...

  6. opencv 3.2图像矩(Image Moments)

    图像矩乍看比较难理解,看了很多资料,大概明白了一些,但还是无法在脑海里形成一个模型概念,于是从源码中寻找它的应用. 今天就通过公式和程序抓取数据,来进一步理解图像矩 先看一个图片 这是程序运行结果, ...

  7. PAT 1067 试密码(20)(代码)

    1067 试密码(20 分) 当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死.本题就请你实现这个小功能. 输入格式: 输入在第一行给出一个密码(长度 ...

  8. android 线性布局

    activity_main.xml线性布局 <?xml version="1.0" encoding="utf-8"?> <LinearLay ...

  9. The 10 Best Choices On The Market Review 2018

    Looking to buy a scan tool or considering one of Autel Scanner impressive product line?. The company ...

  10. python爬虫 urllib库基本使用

    以下内容均为python3.6.*代码 学习爬虫,首先有学会使用urllib库,这个库可以方便的使我们解析网页的内容,本篇讲一下它的基本用法 解析网页 #导入urllib from urllib im ...