Codeforces 805D/804B - Minimum number of steps
传送门: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’的字符串;A、B可为空。)
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的更多相关文章
- 【codeforces 805D】Minimum number of steps
[题目链接]:http://codeforces.com/contest/805/problem/D [题意] 给你一个字符串; 里面只包括a和b; 让你把里面的"ab"子串全都去 ...
- 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 ...
- codeforces 805 D. Minimum number of steps(数学)
题目链接:http://codeforces.com/contest/805/problem/D 题意:只有一个操作就是将ab变成bba直到不能变为止,问最少边几次. 题解:这题可以多列几组来找规律, ...
- Codeforces 805 D Minimum number of steps
题意: 给定一串字符串,将所有“ab”的子串替换为“bba”,询问多少次操作后没有子串“ab”. 分析: 观察可得,将“ab”替换为“bba”有两种结果. ①a移到了b的后面 ②增加了一个b 而且最终 ...
- Codeforces 805D - Minimum number of steps
805D - Minimum number of steps 思路:简单模拟,a每穿过后面一个b,b的个数+1,当这个a穿到最后,相当于把它后面的b的个数翻倍.每个a到达最后的步数相当于这个a与它后面 ...
- 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 ...
- Minimum number of steps 805D
http://codeforces.com/contest/805/problem/D D. Minimum number of steps time limit per test 1 second ...
- 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 ...
- 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 ...
随机推荐
- hdu 4850 字符串构造---欧拉回路构造序列 递归+非递归实现
http://acm.hdu.edu.cn/showproblem.php? pid=4850 题意:构造长度为n的字符序列.使得>=4的子串仅仅出现一次 事实上最长仅仅能构造出来26^4+4- ...
- pattern matching is C# 7.0
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/is 原来的版本 private static s ...
- Android WiFi开发教程(三)——WiFi热点数据传输
在上一篇文章中介绍了WiFi的搜索和连接,如果你还没阅读过,建议先阅读上一篇Android WiFi开发教程(二)——WiFi的搜索和连接.本篇接着简单介绍手机上如何通过WiFi热点进行数据传输. 跟 ...
- CodeForces - 743D Chloe and pleasant prizes
Chloe and pleasant prizes time limit per test 2 seconds memory limit per test 256 megabytes input st ...
- B2460 [BeiJing2011]元素 线性基
这个题是对刚才线性基的一个补充,就是中间有一些小贪心,贪心就很有意思,先按权值排序,然后就瞎搞就行了. 题干: Description 相传,在远古时期,位于西方大陆的 Magic Land 上,人们 ...
- 用Thymeleaf在前台下拉列表取值
转自:https://blog.csdn.net/u013600907/article/details/76165748
- 第2课 Git配置文件的妙用
2-1 "git config" 指令的用法 文件夹中".git"子文件夹内的config文件的优先权>登录账号的home directory中的.gi ...
- sdut1269 走迷宫(dfs)
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1269 连着做了三个基本的dfs,终于弄懂了搜索 ...
- Agri-Net(prim)
http://poj.org/problem?id=1258 #include<stdio.h> #include<string.h> ; <<; int map[ ...
- ride关键字
定义变量:set variable 打印 :log 列表:create list 字符转数字型:evaluate 随机数:evaluate random.randint 日志截图:先导入screens ...