题解-CF1140E Palindrome-less Arrays
\(n\) 和 \(k\) 和 \(n\) 个数的序列 \(a\)。把 \(a\) 中的 \(-1\) 替换成 \([1,k]\) 之间的整数。求使 \(a\) 中不存在长度为奇数的回文串的方案数。
数据范围:\(2\le n,k\le 2\cdot 10^5\),\(a_i=-1{\rm~or~}a_i\in[1,k]\)。
题目限制即不能有 \(a_i=a_{i-2}\)。
令 \(b_i=a_{2i},c_i=a_{2i-1}\)。
答案为序列 \(b\) 和 \(c\) 填成相邻两数不等的方案数积。
如填 \(x,-1,-1,...,-1,y\) 这段 \(i\) 个 \(-1\) 使相邻两数不等:
令 \(f_i\) 表示 \(x=y\) 的填法方案数,\(g_i\) 表示 \(x\not=y\) 的填法方案数。
\begin{cases}
0&(i=0)\\
g_{i-1}(k-1)&{\rm else}\\
\end{cases}\\\\
g_i=
\begin{cases}
1&(i=0)\\
g_{i-1}(k-2)+f_{i-1}&{\rm else}\\
\end{cases}
\]
最后把每段 \(-1\) 的答案乘起来就是填 \(b,c\) 的方案数。
边界的处理具体看代码。
- 代码
#include <bits/stdc++.h>
using namespace std;
//Start
typedef long long ll;
typedef double db;
#define mp(a,b) make_pair(a,b)
#define x first
#define y second
#define b(a) a.begin()
#define e(a) a.end()
#define sz(a) int((a).size())
#define pb(a) push_back(a)
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
//Data
const int N=2e5;
const int mod=998244353;
int n,k,a[N+7];
//DP
int f[2][(N<<1)+7];
int bb,b[(N>>1)+7],cc,c[(N>>1)+7];
void Pre(){
f[0][0]=0,f[1][0]=1;
for(int i=1;i<=(n>>1)+1;i++){
f[0][i]=(ll)f[1][i-1]*(k-1)%mod;
f[1][i]=((ll)f[1][i-1]*(k-2)%mod+f[0][i-1])%mod;
}
}
int DP(int cnt,int s[]){
int len=0,lst=0,res=1;
for(int i=1;i<=cnt;i++){
if(s[i]==-1) len++;
else {
if(len){
if(!lst) res=(ll(k-1)*f[1][len-1]+f[0][len-1])%mod*res%mod;
else if(lst==s[i]) res=(ll)f[0][len]*res%mod;
else res=(ll)f[1][len]*res%mod;
}
len=0,lst=s[i];
}
}
if(len){
if(!lst){
if(len==1) res=k;
else res=(ll(k-1)*f[1][len-2]+f[0][len-2])*k%mod*res%mod;
} else res=(ll(k-1)*f[1][len-1]+f[0][len-1])%mod*res%mod;
}
return res;
}
//Main
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(~a[i]&&i-2>=1&&a[i]==a[i-2]) return puts("0"),0;
if(i&1) c[++cc]=a[i];
else b[++bb]=a[i];
}
Pre();
printf("%d\n",(ll)DP(cc,c)*DP(bb,b)%mod);
return 0;
}
祝大家学习愉快!
题解-CF1140E Palindrome-less Arrays的更多相关文章
- 【题解】Palindrome pairs [Codeforces159D]
[题解]Palindrome pairs [Codeforces159D] 传送门:\(Palindrome\) \(pairs\) \([CF159D]\) [题目描述] 给定一个长度为 \(N\) ...
- [LeetCode 题解]:Palindrome Number
前言 [LeetCode 题解]系列传送门: http://www.cnblogs.com/double-win/category/573499.html 1.题目描述 Determine ...
- leetcode题解 9. Palindrome Number
9. Palindrome Number 题目: Determine whether an integer is a palindrome. Do this without extra space. ...
- 《LeetBook》leetcode题解(9):Palindrome Number[E]——回文数字
我现在在做一个叫<leetbook>的开源书项目,把解题思路都同步更新到github上了,需要的同学可以去看看 地址:https://github.com/hk029/leetcode 这 ...
- [LeetCode 题解]: Valid Palindrome
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignori ...
- LeetCode(125)题解--Valid Palindrome
https://leetcode.com/problems/valid-palindrome/ 题目: Given a string, determine if it is a palindrome, ...
- 算法与数据结构基础 - 哈希表(Hash Table)
Hash Table基础 哈希表(Hash Table)是常用的数据结构,其运用哈希函数(hash function)实现映射,内部使用开放定址.拉链法等方式解决哈希冲突,使得读写时间复杂度平均为O( ...
- 算法与数据结构基础 - 双指针(Two Pointers)
双指针基础 双指针(Two Pointers)是面对数组.链表结构的一种处理技巧.这里“指针”是泛指,不但包括通常意义上的指针,还包括索引.迭代器等可用于遍历的游标. 同方向指针 设定两个指针.从头往 ...
- LeetCode in action
(1) Linked List: 2-add-two-numbers,2.cpp 19-remove-nth-node-from-end-of-list,TBD 21-merge-two-sorted ...
随机推荐
- selenium之 定位以及切换frame(iframe)(转)
frame标签有frameset.frame.iframe三种,frameset跟其他普通标签没有区别,不会影响到正常的定位,而frame与iframe对selenium定位而言是一样的,seleni ...
- cosbench使用方法
前言 cosbench的功能很强大,但是配置起来可能就有点不是太清楚怎么配置了,本篇将梳理一下这个测试的配置过程,以及一些测试注意项目,以免无法完成自己配置模型的情况 安装 cosbench模式是一个 ...
- a^b(取模运算)
a^b(sdtbu oj 1222) Description 对于任意两个正整数a,b(0 <= a, b < 10000)计算ab各位数字的和的各位数字的和的各位数字的和的各位数字的和. ...
- abp(net core)+easyui+efcore实现仓储管理系统——出库管理之六(五十五)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...
- mybatis-plus使用p6spy 插件进行sql性能分析
1.依赖 <dependency> <groupId>p6spy</groupId> <artifactId>p6spy</artifactId& ...
- java8新特性LocalDate、LocalTime、LocalDateTime的学习
以前操作时间都是使用SimpleDateFormat类改变Date的时间格式,使用Calendar类操作时间.但是SimpleDateFormat是线程不安全的,源码如下: private Strin ...
- Android呼吸灯添加
平台:mtk 一.hal层入口 Lights.c (vendor\mediatek\proprietary\hardware\liblights) char const*const RE ...
- yii2.0上传图片
model: 1 use Yii; 2 public $imageUpload; 3 public function rules() 4 { 5 return [ 6 [['imageUpload'] ...
- AcWing 298. 围栏 (POJ1821)
标签(空格分隔): dp 单调队列优化 题目描述 有N块木板从左到右排成一行,有M个工匠对这些木板进行粉刷,每块木板至多被粉刷一次. 第 i 个木匠要么不粉刷,要么粉刷包含木板 \(S_i\) 的,长 ...
- 太干了!一张图整理了 Python 所有内置异常
在编写程序时,可能会经常报出一些异常,很大一方面原因是自己的疏忽大意导致程序给出错误信息,另一方面是因为有些异常是程序运行时不可避免的,比如在爬虫时可能有几个网页的结构不一致,这时两种结构的网页用同一 ...