分析:按照题目所给的意思每次处理得到的新的字符串都是具有高度对称性的,举个例子,如题目所给的第三个字符串,最中间的是B然后两边分散开去,一边是B的话另外一边关于这个中心对称的那个位置一定是D,反过来同理。那么从任意一点,只要找出他的对称中心,从对称中心的另一边到这一点他们之间的所有字符中,去除掉对称中心是B以外,其他的那些字母中,B和D的个数一定是相等的(从题目中所给的变换方法可知)。那么这题就很简单了。就是关于这个对称中心找出这点到其对称点的长度len,B的个数就是len/2+1,因为len显然是奇数,所以(len+1)/2也无妨。

  我们定义dfs(x)表示从第一个到第x个有多少个B,于是从l到r的答案就是dfs(r)-dfs(l-1)。那么现在不妨拿这个长度为7的BBDBBDD来说明dfs这个方法,如果x是7,它是处于这个对称区间的边缘的,直接给出(7+1)/2=4就好了,但是如果是6呢?很显然的要求1到6的B的个数的话,关于第四个对称,字符串被分割成了B BDBBD D这样子,单单用(5+1)/2只能得到3,原因很简单,第一个字母没被考虑,那么只要在对剩下的部分递归进行同样的操作即可。

  关于是不是这个位置处于边界,我们可以简单地预处理出每个字符串的长度:1,3,7,15... ...这样子的话就可以很容易的知道x是属于哪个对称区间里面了,具体见代码:

 #include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
using namespace std;
typedef long long ll; vector<ll> V;
void init()
{
ll x=;
while(x<=(ll)1e18)
{
V.push_back(x);
x=*x+;
}
} ll dfs(ll x)
{
if(x==) return ;
int y=lower_bound(V.begin(),V.end(),x)-V.begin();//找出x被包含在那个对称区间里面
if(V[y]==x) return (x+)/; //如果刚好处于对称区间的边缘,直接返回,因为前面没有没被处理完的字母了
ll t = V[y-]+; //不然的话,很显然前面那个字符串的最后一个位置加1就是x处于的对称区间的对称中心
return x-t++dfs(x-*(x-t)-); //分治剩余部分
} int main()
{
init();
int T;
scanf("%d",&T);
while(T--)
{
ll l,r;
scanf("%I64d%I64d",&l,&r);
ll ans = dfs(r)-dfs(l-);
printf("%I64d\n",ans);
}
return ;
}

2016"百度之星" - 初赛(Astar Round2A)1005 BD String(HDU5694)——找规律、字符串对称、分治的更多相关文章

  1. 2016百度之星-初赛(Astar Round2A)AII X

    Problem Description F(x,m) 代表一个全是由数字x组成的m位数字.请计算,以下式子是否成立: F(x,m) mod k ≡ c Input 第一行一个整数T,表示T组数据. 每 ...

  2. 2016"百度之星" - 初赛(Astar Round2B) 1006 中位数计数

    思路:统计当前数左边比它小|大 i个人,相应右边就应该是比它大|小i个人 l数组表示左边i个人的方案 r表示右边i个人的方案 数组下标不可能是负数所以要加n //#pragma comment(lin ...

  3. 2016"百度之星" - 初赛(Astar Round2A)HDU 5695 拓扑排序+优先队列

    Gym Class Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  4. 2016百度之星 初赛2A ABEF

    只做了1001 1002 1005 1006.剩下2题可能以后补? http://acm.hdu.edu.cn/search.php?field=problem&key=2016%22%B0% ...

  5. HDU 5690:2016"百度之星" - 初赛 All X

    原文链接:https://www.dreamwings.cn/hdu5690/2657.html All X Time Limit: 2000/1000 MS (Java/Others)    Mem ...

  6. 2016百度之星 初赛2B ACEF

    做了1001 1003 1005 1006 看题:http://bestcoder.hdu.edu.cn/contests/contest_show.php?cid=702 交题:http://acm ...

  7. 2016"百度之星" - 初赛(Astar Round2A)

    题目链接: http://bestcoder.hdu.edu.cn/contests/contest_show.php?cid=701 1001 : 矩阵快速幂 #include <iostre ...

  8. 2016"百度之星" - 初赛(Astar Round2A)Gym Class(拓扑排序)

    Gym Class  Accepts: 849  Submissions: 4247  Time Limit: 6000/1000 MS (Java/Others)  Memory Limit: 65 ...

  9. 2016"百度之星" - 初赛(Astar Round2A)All X(数学 矩阵)

    All X  Accepts: 1281  Submissions: 7580  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 65536 ...

随机推荐

  1. 解决https 请求过程中SSL问题

    最近一个项目中用到了https的请求,在实际调用过程中发现之前的http方法不支持https,调用一直报错. 查询了一下,添加几行代码解决问题. public string HttpPost(stri ...

  2. .NET中AOP实现

    静态织入,如:PostSharp(收费)动态织入1.使用Castle DynamicProxy不太方便的是需要在AOP的方法上加上virual关键字,配置较繁琐https://blog.csdn.ne ...

  3. Mediawiki 子页链接无效的问题

    添加下面的配置到 LocalSettings.php 中即可: # Enable subpages in the main namespace $wgNamespacesWithSubpages[NS ...

  4. wince如何扫描条码并且在浏览器上查询数据

    这个挺简单的,winform也适用 public override void OnGetBarcode(string scanStr) { try { Process.Start("iesa ...

  5. node-exporter cpu使用率为负数

    在prometheus利用公式:100 - (avg by (instance) (irate(node_cpu{instance="xxx", mode="idle&q ...

  6. rt-thread下调试elmfat 问题记录

    硬件平台:stm32f107   SPI flash:w25q32 RTT版本:v2.1 w25q32的驱动大神们已经写好(w25qxx.c),我只需要照猫画虎的实现相应SPI的驱动程序即可(bsp例 ...

  7. Python asyncio 模块

    Python 3.4 asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持. asyncio的编程模型就是一个消息循环.我们从asyncio模块中直接获取一个EventLo ...

  8. 学习笔记:Python序列化常用工具及性能对比

    什么叫序列化?简单来讲就是将内存中的变量数据转而存储到磁盘上或是通过网络传输到远程. 反序列化是指:把变量数据从序列化的对象重新读到内存里. 下面我们一起来看看,python里面序列化常用的json. ...

  9. 15、TDM模型

    论文:https://arxiv.org/pdf/1801.02294.pdf 解析: 学习基于树的推荐系统深度模型 Learning Tree-based DeepModel for Recomme ...

  10. Spring整合rabbitmq(转载)

    原文地址:https://my.oschina.net/never/blog/140368 1.首先是生产者配置 <?xml version="1.0" encoding=& ...