分析:按照题目所给的意思每次处理得到的新的字符串都是具有高度对称性的,举个例子,如题目所给的第三个字符串,最中间的是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 ;
}

最新文章

  1. express中url的参数传递和获取
  2. listener监听器的相关知识
  3. $(window).height()获取到的高度不对
  4. winform开发之UI系列
  5. sqlalchemy多表联合查询(join)
  6. easyui的datagrid实例实现
  7. linux下获得块设备大小
  8. 各大Oj平台介绍[转]
  9. Json.Net序列化和反序列化设置
  10. ie6背景透明的设置方法 ie6背景颜色透明和png图像透明解决方法
  11. Angular - - angular.forEach、angular.extend
  12. nmon指标
  13. 用.Net Core控制台模拟一个ASP.Net Core的管道模型
  14. linux的slect的脚本适用于交互
  15. 014_IP专项研究监控
  16. windows2012服务器中安装php7+mysql5.7+apache2.4环境
  17. python语法_json_pickle
  18. 使用Jmeter连接数据库检查数据库记录的方法
  19. Linux学习15-CentOS安装mysql5.6环境
  20. [Xamarin.Android]如何引用JAR檔案 (转帖)

热门文章

  1. CCF 201809-1 卖菜
  2. spingboot启动报驱动Loading class `com.mysql.jdbc.Driver&#39;. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver&#39;. The driver is automatically registered via the SPI and manual loading of th
  3. javaWeb文件上传与下载
  4. 清除keil编译中间文件的脚本
  5. 15_sqoop数据导出
  6. 用js刷剑指offer(链表中倒数第k个结点)
  7. 《JavaScript DOM编程艺术》(第二版)学习笔记(一)
  8. 从项目开始的Java开发学习
  9. redis过期机制及排行榜
  10. 算法:统计1-n中,1出现的次数