BZOJ2958 序列染色
果然清华集训的题目。。。显然的DP题但是不会做。。。
我们令f[i][j][w]表示状态方程
w表示到了字符串的第w个
i = 0, 1, 2分别表示k个B和k个W都没填上、k个B填上了k个W没填上、k个B和k个W都填上了三种状态
j = 0, 1分别表示第w位上填B/W
于是方程就比较容易列出来了,注意要用到容斥原理
/**************************************************************
Problem: 2958
User: rausen
Language: C++
Result: Accepted
Time:652 ms
Memory:33032 kb
****************************************************************/ #include <cstdio> using namespace std;
const int N = ;
const int mod = 1e9 + ; int n, k;
char st[N];
int s0[N], s1[N], f[][][N]; void read_in() {
int i;
char ch = getchar();
while (ch != 'W' && ch != 'B' && ch != 'X')
ch = getchar();
for (i = ; i <= n; ++i)
st[i] = ch, ch = getchar();
} inline int calc(char c, int *s, int i, int t) {
if (i < k || st[i - k] == c || s[i] - s[i - k]) return ;
return f[t - ][i == k ? : - t][i - k];
} int main() {
int i;
scanf("%d%d", &n, &k);
read_in();
f[][][] = ;
for (i = ; i <= n; ++i) {
s0[i] = s0[i - ] + (st[i] == 'W');
s1[i] = s1[i - ] + (st[i] == 'B');
if (st[i] != 'W') {
f[][][i] = (0ll + f[][][i - ] + f[][][i - ] - calc('B', s0, i, ) + mod) % mod;
f[][][i] = (0ll + f[][][i - ] + f[][][i - ] + calc('B', s0, i, )) % mod;
f[][][i] = (0ll + f[][][i - ] + f[][][i - ]) % mod;
}
if (st[i] != 'B') {
f[][][i] = (0ll + f[][][i - ] + f[][][i - ]) % mod;
f[][][i] = (0ll + f[][][i - ] + f[][][i - ] - calc('W', s1, i, ) + mod) % mod;
f[][][i] = (0ll + f[][][i - ] + f[][][i - ] + calc('W', s1, i, )) % mod;
}
}
printf("%d\n", (f[][][n] + f[][][n]) % mod);
return ;
}
(p.s. Orz 江哥...)
BZOJ2958 序列染色的更多相关文章
- bzoj2958: 序列染色(DP)
2958: 序列染色 题目:传送门 题解: 大难题啊(还是我太菜了) %一发大佬QTT 代码: #include<cstdio> #include<cstring> #incl ...
- BZOJ2958 序列染色(动态规划)
令f[i][0/1/2][0/1]表示前i位,不存在满足要求的B串和W串/存在满足要求的B串不存在W串/存在满足要求的B串和W串,第i位填的是B/W的方案数.转移时考虑连续的一段填什么.大讨论一波后瞎 ...
- bzoj2958: 序列染色&&3269: 序列染色
DP这种东西,考场上就只能看命了.. #include<cstdio> #include<iostream> #include<cstring> #include& ...
- BZOJ:2958 序列染色 DP
bzoj2958 序列染色 题目传送门 Description 给出一个长度为N由B.W.X三种字符组成的字符串S,你需要把每一个X染成B或W中的一个. 对于给出的K,问有多少种染色方式使得存在整数a ...
- BZOJ 1006 [HNOI2008] 神奇的国度(简单弦图的染色)
题目大意 K 国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即 AB 相互认识,BC 相互认识,CA 相互认识,是简洁高效的.为了巩固三角关系,K 国禁止四边关系,五边关系等 ...
- [BZOJ5306][HAOI2018]染色
bzoj luogu Description 给一个长度为\(n\)的序列染色,每个位置上可以染\(m\)种颜色.如果染色后出现了\(S\)次的颜色有\(k\)种,那么这次染色就可以获得\(w_k\) ...
- Solution -「HAOI 2018」「洛谷 P4491」染色
\(\mathcal{Description}\) Link. 用 \(m\) 种颜色为长为 \(n\) 的序列染色,每个位置一种颜色.对于一种染色方案,其价值为 \(w(\text{出现恰 ...
- 2016 Multi-university training contest
day 1 A 给G,w(e)1M(diff),|V|100K,|E|1M,求 MST MST上任意两点间距离的期望 显然MST唯一 E(dis(u,v))可以通过计算每条边的贡献加出来 B n个并行 ...
- bzoj1006 [HNOI2008]神奇的国度
1006: [HNOI2008]神奇的国度 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 2304 Solved: 1043 Description ...
随机推荐
- python bug the C library strftime function.
import timedef date2mktime(date, format_='%Y-%m-%d'): return int(time.mktime(time.strptime(date, for ...
- Jmeter,常见参数 vars、prev、ctx 、props 类的api--beanshell
http://www.cnblogs.com/fnng/p/5827577.html---------jmeter 性能测试 jmeter常见参数 vars.prev.ctx .props 类的api ...
- Android中的Handler及它所引出的Looper、MessageQueue、Message
0.引入 0.1.线程间通信的目的 首先,线程间通信要交流些什么呢? 解答这个问题要从为什么要有多线程开始,需要多线程的原因大概有这些 最早也最基本:有的任务需要大量的时间,但其实并不占用计算资源,比 ...
- mysql join实现方式
1. nested loop join 分别从两个表读一行数据进行两两对比,复杂度是n^2 2. block nested loop join 分别从两个表读很多行数据,然后进行两两对比,复杂度也是n ...
- 使用Navicat连接Mysql报错:can not get hostname for your address
以管理员的身份使用cmd命令运行netsh winsock reset即可!
- 【转发】Python使用openpyxl读写excel文件
Python使用openpyxl读写excel文件 这是一个第三方库,可以处理xlsx格式的Excel文件.pip install openpyxl安装.如果使用Aanconda,应该自带了. 读取E ...
- java反射机制与动态代理
在学习HadoopRPC时.用到了函数调用.函数调用都是採用的java的反射机制和动态代理来实现的,所以如今回想下java的反射和动态代理的相关知识. 一.反射 JAVA反射机制定义: JAVA反射机 ...
- java, android的aes等加密库
https://github.com/scottyab/AESCrypt-Android https://github.com/PDDStudio/EncryptedPreferences ...
- hive两大表关联优化试验
呼叫结果(call_result)与销售历史(sale_history)的join优化: CALL_RESULT: 32亿条/444G SALE_HISTORY:17亿条/439G 原逻辑 Map: ...
- java一些基本的方法
一,Java中,next();和nextLine();有什么区别 举个例子,你就会明白了.如,你输入的一行:abc cde efg注意,其中abc和cde之间有空格,cde和efg之间也有空格这样,n ...