传送门:http://codeforces.com/contest/805/problem/D

对于一个由‘a’、‘b’组成的字符串,有如下操作:将字符串中的一个子串“ab”替换成“bba”。当字符串中不含有子串“ab”时,任务完成。求完成任务的最小操作次数(mod109+7)。

最终,字符串的形式为:

bbb...baaa...a

可以考虑寻找规律:

a.

i)“ab”→“bba”,

ii)“aab”→“abba”→“bbaba”→“bbbbaa”,

iii)“aaab”→“aabba”→“abbaba”→“bbababa”→“bbbbaaba”→“bbbbabbaa”→“bbbbbbabaa”→“bbbbbbbbaaa”;

b.

i)“ab”→“bba”,

ii)“abb”→“bbab”→“bbbba”,

iii)“abbb”→“bbabb”→“bbbbab”→“bbbbbba”。

可见,$"\underbrace{a\cdots a}_{n}b"$型字符串的操作次数为2n-1,$"a\underbrace{b\cdots b}_{m}"$型字符串的操作次数为m。下证之:

a.(证:$"a\underbrace{b\cdots b}_{m}"$型字符串的操作次数为m

i)当m=1时,“ab”→“bba”,操作次数为1;

ii)假设当m=k时,$"a\underbrace{b\cdots b}_{k}"$→$"\underbrace{b\cdots b}_{2k}a"$,操作次数为k,则当m=k+1时:

由$"a\underbrace{b\cdots b}_{2k+1}b"$→$"\underbrace{b\cdots b}_{2k}ab"$的操作次数为k,由$"\underbrace{b\cdots b}_{2k}ab"$→$"\underbrace{b\cdots b}_{2k}bba"$的操作次数为1。故由$"a\underbrace{b\cdots b}_{2k+1}"$→$"\underbrace{b\cdots b}_{2k+2}a"$的操作次数为k+1。

b.(证:$"\underbrace{a\cdots a}_{n}b"$型字符串的操作次数为2n-1)

i)当n=1时,“ab”→“bba”,操作次数为1;

ii)假设当n=k时,$"\underbrace{a\cdots a}_{k}b"$→$"\underbrace{b\cdots b}_{2^{k}}\underbrace{a\cdots a}_{k}"$,操作次数为2k-1,则当n=k+1时:

由$"a\underbrace{a\cdots a}_{k}b"$→$"a\underbrace{b\cdots b}_{2^{k}}\underbrace{a\cdots a}_{k}"$的操作次数为2k-1,由$"a\underbrace{b\cdots b}_{2^{k}}\underbrace{a\cdots a}_{k}"$→$"\underbrace{b\cdots b}_{2^{k}}\underbrace{b\cdots b}_{2^{k}}a\underbrace{a\cdots a}_{n}"$的操作次数为2k。故由$"\underbrace{a\cdots a}_{k+1}b"$→$"\underbrace{b\cdots b}_{2^{k+1}}\underbrace{a\cdots a}_{k+1}"$的操作次数为2k-1+2k=2k+1-1。

考虑一般的情形:

设字符串的长度为len,其中,字符‘b’占据位置p1,p2,...,pn。这个字符串对应的操作次数为:$\sum_{i=1}^{n}(2^{p_{i}-i}-1)$。

若1..pi的字符‘a’个数为cnti,则cnti=pi-i。这个字符串对应的操作次数为:$\sum_{i=1}^{n}(2^{cnt_{i}}-1)$。

下证之:

A为只含有字符‘a’的字符串,B为只含有字符‘b’的字符串;AB可为空。)

i)当n=1时,$"\underbrace{a\cdots a}_{cnt_{1}}\underset{1}{b}"$→"BA",操作次数为$2^{cnt_{1}}-1$;

ii)假设当n=k时,$"A\underset{1}{b}\cdots A\underset{k}{b}\cdots"$→"BA"的操作次数为$\sum_{i=1}^{k}(2^{cnt_{i}}-1)$,则当n=k+1时:

由$"A\underset{1}{b}\cdots A\underset{k}{b}A\underset{k+1}{b}\cdots"$→$"BA*\underset{k+1}{b}\cdots"$的操作次数为$\sum_{i=1}^{k}(2^{cnt_{i}}-1)$,A*的长度为cntk+1,则由$"BA*\underset{k+1}{b}\cdots"$→"BA"的操作次数为$2^{cnt_{k+1}}-1$。故由$"A\underset{1}{b}\cdots A\underset{k}{b}A\underset{k+1}{b}\cdots"$→"BA"的操作次数为$\sum_{i=1}^{k+1}(2^{cnt_{i}}-1)$。

参考程序如下:

#include <stdio.h>
#define MOD 1000000007 int pwr(long long x, int p)
{
if (p == ) return ;
if (p & ) return x * pwr(x, p - ) % MOD;
return pwr(x * x % MOD, p >> ) % MOD;
} int main(void)
{
char ch;
int cnt = , ans = ;
while ((ch = getchar()) != '\n') {
if (ch == 'a') cnt++;
else {
ans += pwr(, cnt) - ;
ans %= MOD;
}
}
printf("%d\n", ans);
}

Codeforces 805D/804B - Minimum number of steps的更多相关文章

  1. 【codeforces 805D】Minimum number of steps

    [题目链接]:http://codeforces.com/contest/805/problem/D [题意] 给你一个字符串; 里面只包括a和b; 让你把里面的"ab"子串全都去 ...

  2. codeforce 804B Minimum number of steps

    cf劲啊 原题: We have a string of letters 'a' and 'b'. We want to perform some operations on it. On each ...

  3. codeforces 805 D. Minimum number of steps(数学)

    题目链接:http://codeforces.com/contest/805/problem/D 题意:只有一个操作就是将ab变成bba直到不能变为止,问最少边几次. 题解:这题可以多列几组来找规律, ...

  4. Codeforces 805 D Minimum number of steps

    题意: 给定一串字符串,将所有“ab”的子串替换为“bba”,询问多少次操作后没有子串“ab”. 分析: 观察可得,将“ab”替换为“bba”有两种结果. ①a移到了b的后面 ②增加了一个b 而且最终 ...

  5. Codeforces 805D - Minimum number of steps

    805D - Minimum number of steps 思路:简单模拟,a每穿过后面一个b,b的个数+1,当这个a穿到最后,相当于把它后面的b的个数翻倍.每个a到达最后的步数相当于这个a与它后面 ...

  6. Minimum number of steps CodeForces - 805D(签到题)

    D. Minimum number of steps time limit per test 1 second memory limit per test 256 megabytes input st ...

  7. Minimum number of steps 805D

    http://codeforces.com/contest/805/problem/D D. Minimum number of steps time limit per test 1 second ...

  8. Codeforces Round #411 div 2 D. Minimum number of steps

    D. Minimum number of steps time limit per test 1 second memory limit per test 256 megabytes input st ...

  9. Codeforces805D. Minimum number of steps 2017-05-05 08:46 240人阅读 评论(0) 收藏

    D. Minimum number of steps time limit per test 1 second memory limit per test 256 megabytes input st ...

随机推荐

  1. Spring:验证用户登录

    利用 Spring IOC 技术实现用户登录的验证机制,对用户进行登录验证. 首先利用 Spring 的自动装配模式将 User 对象注入到控制器中,然后将用户输入的用户名和密码与系统中限定的合法用户 ...

  2. kafka的topic和分区策略——log entry和消息id索引文件

    Topic在逻辑上可以被认为是一个在的queue,每条消费都必须指定它的topic,可以简单理解为必须指明把这条消息放进哪个queue里. 为了使得Kafka的吞吐率可以水平扩展,物理上把topic分 ...

  3. web认证方案

    web构建在http之上,而它又是无状态协议,如何控制用户访问服务器上的受限资源呢? 最原始你想法通过http基本认证,每次发请求时都向后台传递用户名密码信息,服务器每次收到请求后都先验证用户是否合法 ...

  4. Python 36 GIL全局解释器锁 、vs自定义互斥锁

    一:GIL全局解释器锁介绍 在CPython中,全局解释器锁(或GIL)是一个互斥锁, 它阻止多个本机线程同时执行Python字节码.译文:之所以需要这个锁, 主要是因为CPython的内存管理不是线 ...

  5. mysql行列转置

    --创建行转列表及插入数据 create table tb_RowConvertToColumn ( username nvarchar(100) null, course nvarchar(100) ...

  6. CAS配置(1)SSL证书配置

    一.配置源码 源码配置稍后提供 二.系统环境安装 安装JDK配置,版本>=1.7 环境变量配置(参考): JAVA_HOME=C:\Program Files x86)\Java\jdk1.7. ...

  7. SQLServer2008 表连接时null 和 null 无法匹配?

    例如 select * from tbl_a a left join tbl_b b on b.docno=a.docno and b.project=a.project where a.docno= ...

  8. android黑科技系列——爆破一款应用的签名验证问题

    一.前言 在之前的文章中说过Android中的安全和破解是相辅相成的,为了防止被破解,很多应用做了一些防护策略,但是防护策略也是分等级,一般简单的策略就是混淆代码和签名校验,而对于签名校验很多应用都是 ...

  9. js match 来点击切换图片

     定义和用法 match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配. 该方法类似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置. ...

  10. 搭建Hadoop所遇过的坑

    问题1: 报错信息如下: Container exited with a non-zero exit code 143 Killed by external signal 解决方案: 分配的资源不够, ...