传送门: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. $().attr()的使用方法 &amp;&amp; $().html()与$().text()的差别

    <1>$().attr()的使用方法 </pre><pre class="html" name="code"><htm ...

  2. HDU5567/BestCoder Round #63 (div.2) A sequence1 水

    sequence1  Given an array a with length n, could you tell me how many pairs (i,j) ( i < j ) for a ...

  3. Elias-Fano编码算法——倒排索引压缩用,本质上就是桶排序数据结构思路

    Elias-Fano编码过程如下:把一组整数的最低l位连接在一起,同时把高位以严格单调增的排序划分为桶. Example: 2, 3, 5, 7, 11, 13, 24 Count in unary ...

  4. ledisDB底层实现——本质上就是用leveldb这样的底层存储,和ssdb一样,meta里存的是hash、list等的元数据

    Hash hash可以算是一种两级kv,首先通过key找到一个hash对象,然后再通过field找到或者设置相应的值. 在ledisdb里面,我们需要将key跟field关联成一个key,用来存放或者 ...

  5. PCB 无需解压,直接读取Genesis TGZ指定文件 实现方法

    通过无需解压读取ZIP压缩包的方法,寻思者如何可以不解压直接读Genesis TGZ文件内容, 通过查找资料,原来可以通过:SharpCompress.dll工具实现此需求,此工具如此NB 一.Sha ...

  6. poj2975 Nim(经典博弈)

    Nim Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5866   Accepted: 2777 Description N ...

  7. inline-block默认间距解决方法

    方法一: 父元素设置font-size: 0;  行内块元素有文字时再在该元素上设置font-size 方法二: 父元素设置word-spacing为负 方法三: Inline-block   元素浮 ...

  8. dubbo之泛化引用

    使用泛化调用 泛化接口调用方式主要用于客户端没有 API 接口及模型类元的情况,参数及返回值中的所有 POJO 均用 Map 表示,通常用于框架集成,比如:实现一个通用的服务测试框架,可通过 Gene ...

  9. CXF-JAX-RS开发(一)入门案例

    一.简介 资源驱动.基于HTTP协议[按照标准指定URL,就可以访问数据]以XML|JSON格式传输数据. 二.quickstart 1.创建maven project[Packaging:jar] ...

  10. php xss 函数

    function xss($string) { if (is_array($string)||is_object($string)||is_resource($string)) { return '' ...