HDU 5694 BD String 迭代
BD String
题目连接:
http://acm.hdu.edu.cn/showproblem.php?pid=5694
Description
Problem Description
众所周知,度度熊喜欢的字符只有两个:B和D。
今天,它发明了一种用B和D组成字符串的规则:
S(1)=B
S(2)=BBD
S(3)=BBDBBDD
…
S(n)=S(n−1)+B+reverse(flip(S(n−1))
其中,reverse(s)指将字符串翻转,比如reverse(BBD)=DBB,flip(s)指将字符串中的B替换为D,D替换为B,比如flip(BBD)=DDB。
虽然度度熊平常只用它的电脑玩连连看,这丝毫不妨碍这台机器无与伦比的运算速度,目前它已经算出了S(21000)的内容,但度度熊毕竟只是只熊,一次读不完这么长的字符串。它现在想知道,这个字符串的第L位(从1开始)到第R位,含有的B的个数是多少?
Input
第一行一个整数T,表示T(1≤T≤1000) 组数据。
每组数据包含两个数L和R(1≤L≤R≤1018) 。
Output
对于每组数据,输出S(21000)表示的字符串的第L位到第R位中B的个数。
Sample Input
3
1 3
1 7
4 8
Sample Output
2
4
3
Hint
题意
题解:
假设我知道了solve(i),表示求i之前有多少个b
那么答案就是solve(r)-solve(l-1)嘛
这个怎么实现呢?不停迭代下去就好了……
因为你S[i] = s[i-1]+1+rs[i-1]
这个可以迭代的,复杂度是logn的,具体看get函数的代码吧……
代码
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn = 61;
long long len[maxn],B[maxn],D[maxn],sumB[maxn];
void pre()
{
len[1]=B[1]=sumB[1]=1;
for(int i=2;i<maxn;i++){
len[i]=2LL*len[i-1]+1;
B[i]=D[i-1]+1+B[i-1];
D[i]=B[i-1]+D[i-1];
}
}
long long get(long long x)
{
if(x==0)return 0;
if(x==1)return 1;
int p=lower_bound(len+1,len+61,x)-len;
if(x==len[p])return B[p];
if(x>=(len[p-1]+1)/2+1+len[p-1])
return B[p-1]+1+get(x-len[p-1]-1)-1;
return B[p-1]+1+get(x-len[p-1]-1);
}
void solve()
{
long long l,r;
scanf("%lld%lld",&l,&r);
cout<<get(r)-get(l-1)<<endl;
}
int main()
{
pre();
int t;
scanf("%d",&t);
while(t--)solve();
return 0;
}
HDU 5694 BD String 迭代的更多相关文章
- HDU 5694——BD String——————【递归求解】
BD String Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- HDU 5694 BD String 递归暴力
http://blog.csdn.net/angon823/article/details/51484906 #include <cstdio> #include <iostream ...
- hdu-5694 BD String(分治)
题目链接: BD String Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- HDU 4054 Number String
HDU 4054 Number String 思路: 状态:dp[i][j]表示以j结尾i的排列 状态转移: 如果s[i - 1]是' I ',那么dp[i][j] = dp[i-1][j-1] + ...
- BD String
BD String Accepts: 388 Submissions: 1164 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/ ...
- hdu 5311 Hidden String
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5311 Hidden String Description Today is the 1st anniv ...
- hdu 5311 Hidden String (BestCoder 1st Anniversary ($))(深搜)
http://acm.hdu.edu.cn/showproblem.php?pid=5311 Hidden String Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 5311 Hidden String (暴力)
题意:今天是BestCoder一周年纪念日. 比赛管理员Soda有一个长度为n的字符串s. 他想要知道能否找到s的三个互不相交的子串s[l1..r1], s[l2..r2], s[l3..r3]满足下 ...
- HDU 4668 Finding string (解析字符串 + KMP)
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 题意:给出一个压缩后的串,以及一个模式串,问模式串 ...
随机推荐
- python目前安装的包备份
Package Version ------------------------------- ------------------ alembic altgraph 0.14 apistar app ...
- html 列表标签
1.有序列表 <ol> <li>你好</li> <li>你好</li> <li>你好</li> </ol> ...
- 爬虫基础---HTTP协议理解、网页的基础知识、爬虫的基本原理
一.HTTP协议的理解 URL和URI 在学习HTTP之前我们需要了解一下URL.URI(精确的说明某资源的位置以及如果去访问它) URL:Universal Resource Locator 统一资 ...
- DOS命令基础,包涵DOS库说明书
20种常用的DOS命令小结 作者: 字体:[增加 减小] 类型:转载 DOS命令总共大约有一百个(包括文本编辑.查杀病毒.配置文件.批处理等),我们这里详细介绍二十个常用的DOS命令 先介 ...
- Python基础 - 系统进程调用
subprocess模块 近期发现还有一个更好的用于取代subprocess的库,sh,也是openstack当中使用的库.
- java 添加一组元素
在java包中的Arrays和Collection类中都有很多实用方法,可以在一个Collection中添加一组元素,Array.asList()方法接受一个数组或是一个用逗号分隔的元素列表(使用可变 ...
- ZK分布式锁(未完 待续)
实现思路 公平锁:创建有序节点,判断本节点是不是序号最小的节点(第一个节点),若是,则获取锁:若不是,则监听比该节点小的那个节点的删除事件. 非公平锁:直接尝试在指定path下创建节点,创建成功,则说 ...
- Python 安装 pytesser 处理验证码出现的问题
今天这个问题困扰了我好久,开始直接用 pip install pytesseract 安装了 pytesseract 然后出现了如下错误 Traceback (most recent call las ...
- nginx+keepalived高可用服务器宕机解决方案
http://blog.51cto.com/gdutcxh/2109841 https://blog.csdn.net/winsonyuan/article/details/52784988
- 003 python流程控制与函数
一:控制语句 1.条件语句 注意: if: elif: elif: else: 2.while循环 里面可以加else. # coding=utf-8 count=0 while count<3 ...