Description

Taring 喜欢晴天,也喜欢雨天。

Taring说:我想体验连续的\(K\)天的晴朗,去远足,去放歌;我还想再这\(K\)个晴天之后,再去体验连续的K天的云雨,去感受落雨时的轻语。这是令Taring最开心的事情了。其它的时间,Taring会在机房默默的编写着代码。

当然,Taring不想在这连续的\(K\)个晴天和连续的\(K\)个雨天里被机房的事务打扰或者被自然天气的变化中断。也就是说,这K个晴天和K个雨天必须是连续的,但是他们之间并不需要时间连续。显然的,Taring如果在感受了连续的\(K\)天晴朗后,前去机房写代码,等待下雨的时候再次开始他的感悟,这样是不会影响Taring的心情的。

Taring通过天气预报得到了最近连续\(N\)天中若干天的天气情况(天气情况只有“晴”和“雨”两种),但其他的天数的天气情况均是未知的。

他想知道有多少种可能的不同的天气情况(对于两种天气情况,如果有任意一天的天气情况是不一样的,就算做不同的天气情况),使他能够完成这两项体验。

Input Format

输入共有两行。

第\(1\)行有\(2\)个整数,分别表示上文中所述的\(N\)和\(K\)。

第2行是一个长度为N的字符串,仅包含有\(B\)(清),\(W\)(雨),\(X\)(未知)三种字符。

Output Format

输出一个整数\(Ans\),表示合法的天气方案数量。

由于\(Ans\)可能很大,请将答案\(Mod\;1,000,000,007 (10^9+7)\)

Sample Input

4 2

XXXX

Sample Output

1

这题是usedtobe大佬要我做的,他的dp比我的好写,我也不知道他写了什么。

考虑最后的方案肯定时晴雨天相

我的做法是这样的\(f[i][j][k]\)表示前\(i\)天,且最后一天是\(j\)天气(\(0\)晴天,\(1\)雨天),且状态为\(k\)的方案数(\(0\)表示没有经历连续\(K\)个晴天,\(1\)表示已经经过了连续\(K\)个晴天,\(2\)表示已经经过了连续\(K\)个晴天和连续\(K\)个雨天)。

运用前缀和优化可以把复杂度优化到\(O(n)\),转移脑补吧。

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
using namespace std; #define rhl (1000000007)
#define maxn (1000010)
int ans,N,K,f[maxn][2][3],pre[2][maxn]; char s[maxn]; //f[i][j][k]表示长度为i,最后一个是j(0\1),切当前状态为k的方案数 inline void upd(int &x) { if (x < 0) x += rhl; if (x >= rhl) x -= rhl; } int main()
{
freopen("1285.in","r",stdin);
freopen("1285.out","w",stdout);
scanf("%d %d\n",&N,&K); scanf("%s",s+1);
for (int i = 1;i <= N;++i)
{
if (s[i] == 'B') pre[0][i] = i;
else if (s[i] == 'W') pre[1][i] = i;
pre[0][i] = max(pre[0][i],pre[0][i-1]);
pre[1][i] = max(pre[1][i],pre[1][i-1]);
}
f[0][0][0] = f[0][1][0] = 1;
for (int i = 1,l1,l2,mx;i <= N;++i) //枚举位置
{
for (int p = 0,q = 1;p < 2;++p,q ^= 1)
{
if (p == 0&&s[i] == 'W') continue;
if (p == 1&&s[i] == 'B') continue;
l1 = i-K+1; l2 = pre[q][i]; mx = max(l1,l2);
//无长度拓展
for (int k = 0;k < 3;++k)
{
f[i][p][k] += f[i-1][q][k];
if (mx) f[i][p][k] -= f[mx-1][q][k];
upd(f[i][p][k]);
}
//有长度拓展
if (l1&&l1 >= l2)
{
//k == 0
if (p == 1)
{
f[i][p][0] += f[l1-1][q][0];
if (l2) f[i][p][0] -= f[l2-1][q][0];
upd(f[i][p][0]);
} //k == 1
if (p == 0)
{
f[i][p][1] += f[l1-1][q][0];
if (l2) f[i][p][1] -= f[l2-1][q][0];
upd(f[i][p][1]); f[i][p][1] += f[l1-1][q][1];
if (l2) f[i][p][1] -= f[l2-1][q][1];
upd(f[i][p][1]);
} //k == 2
if (p == 0)
{
f[i][p][2] += f[l1-1][q][2];
if (l2) f[i][p][2] -= f[l2-1][q][2];
upd(f[i][p][2]);
}
else
{
f[i][p][2] += f[l1-1][q][1];
if (l2) f[i][p][2] -= f[l2-1][q][1];
upd(f[i][p][2]); f[i][p][2] += f[l1-1][q][2];
if (l2) f[i][p][2] -= f[l2-1][q][2];
upd(f[i][p][2]);
}
}
}
for (int j = 0;j < 3;++j)
{
f[i][0][j] += f[i-1][0][j]; f[i][1][j] += f[i-1][1][j];
upd(f[i][0][j]); upd(f[i][1][j]);
}
}
ans = f[N][0][2]+f[N][1][2]-f[N-1][0][2]-f[N-1][1][2]; upd(ans);
printf("%d",ans);
fclose(stdin); fclose(stdout);
return 0;
}

sjtu1285 时晴时雨的更多相关文章

  1. windows类书的学习心得(转载)

    原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...

  2. 从 Paxos 到 ZooKeeper

    分布式一致性 分布式文件系统.缓存系统和数据库等大型分布式存储系统中,分布式一致性都是一个重要的问题. 什么是分布式一致性?分布式一致性分为哪些类型?分布式系统达到一致性后将会是一个什么样的状态? 如 ...

  3. 学习TestNG,乍暖还寒冷时

    时间:2019年2月23日,农历正月十九,星期六,天气晴,略有阳光,但下午三点多就不见阳光了. 地点:上海 昨夜雨疏风骤,浓睡不消残酒.试问卷帘人,却道海棠依旧.知否?知否?应是绿肥红瘦 是的,魔都上 ...

  4. NOIP2018 Day0 回首向来萧瑟处,也无风雨也无晴

    回首向来萧瑟处,也无风雨也无晴 NOIP2018 Day0 感想  by HGOI ljc20020730 Back ground: /* HGOI 陈功杰让我们写初赛总结?! (考这么烂还要写总结? ...

  5. 将子类对象引用赋值给超类对象 JAVA 编译时多态性

    将子类对象引用赋值给超类对象 JAVA 编译时多态性(转) (2012-05-10 11:24:05) 转载▼ 标签: 杂谈 分类: 也无晴_soft 1.通过将子类对象引用赋值给超类对象引用变量来实 ...

  6. 写C#代码时用到的中文简体字 、繁体字 对应的转化 (收藏吧)

    简体字    下面有与之对应的繁体字 private const String Jian = "啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆疤巴拔跋靶 ...

  7. 故障重现, JAVA进程内存不够时突然挂掉模拟

    背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...

  8. XStream将java对象转换为xml时,对象字段中的下划线“_”,转换后变成了两个的解决办法

            在前几天的一个项目中,由于数据库字段的命名原因 其中有两项:一项叫做"市场价格"一项叫做"商店价格" 为了便于区分,遂分别将其命名为market ...

  9. 对Castle Windsor的Resolve方法的解析时new对象的探讨

    依赖注入框架Castle Windsor从容器里解析一个实例时(也就是调用Resolve方法),是通过调用待解析对象的构造函数new一个对象并返回,那么问题是:它是调用哪个构造函数呢? 无参的构造函数 ...

随机推荐

  1. SpringAOP的注解方式

    AOP(注解)[理解][应用][重点] 1.AOP注解配置流程 A.开启AOP配置支持注解@aspectj 核心配置文件中添加以下配置,功能等同于注解配置Bean的自动扫描路径 <aop:asp ...

  2. Linux编程简介

    Linux编程可以分为Shell(如BASH.TCSH.GAWK.Perl.Tcl和Tk等)编程和高级语言(C语言,C++语言,java语言等)编程,Linux程序需要首先转化为低级机器语言即所谓的二 ...

  3. ACM——直接插入法排序

    NOJ——1062 直接插入排序 时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte 总提交:446            测试通过:212 ...

  4. C++实现元组

    一般我们使用struct时需要在头文件中定义,例如 struct Example { int a; char b; ... }; 这样将数据打包好必须在程序运行之前将其定义好,如果有需求在程序运行时添 ...

  5. selinux理解1-selinux介绍

    安全增强式Linux(SELinux, Security-Enhanced Linux)是一种强制访问控制(mandatory access control)的实现.它的作法是以最小权限原则(prin ...

  6. 第27条:使用“class-continuation分类”隐藏实现细节

    Objective-C动态消息系统(参见第11条)的工作方式决定了其不可能实现真正的私有方法或私有实例变量. 匿名分类的特点: 与普通的分类不同,它必须定义在其所接续的那个类的实现文件里. 唯一能声明 ...

  7. CocoaPods的使用详解

    CocoaPods是什么 当我们开发 iOS 项目时候,会经常使用到第三方类库,并且会使用很多.大家的做法基本上都是到 GitHub 上下载一个一个的类库,然后导入到工程中,并且引入各种的类库,做各种 ...

  8. Android笔记之adb命令应用实例1(手机端与PC端socket通讯下)

    通过adb和Android通讯需要引用adb相关的组件到项目中,分别为:adb.exe,AdbWinApi.dll,AdbWinUsbApi.dll. 可以在XXX\sdk\platform-tool ...

  9. 安卓Handler机制的例子

    Handler机制是实现线程之间通讯的一种很常见的方法,很多时候都会用到. package com.lab.activity; import android.app.Activity; import ...

  10. 【应用】:shell crontab定时生成oracle表的数据到txt文件,并上传到ftp

    一.本人环境描述      1.oracle服务端装在win7 32位上,oracle版本为10.2.0.1.0      2.Linux为centos6.5 32位,安装在Oracle VM Vir ...