分析:按照题目所给的意思每次处理得到的新的字符串都是具有高度对称性的,举个例子,如题目所给的第三个字符串,最中间的是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. C#如何调用C++(基础篇)

    闲暇之余,记一下笔记!记录一下c#如何调用C++的动态库(dll). 步骤: 一.创建一个C++类,例如: AddOperate.h extern _declspec(dllexport) int S ...

  2. Junit 学习1 junit的简单使用

    package junit; import java.sql.Connection; import java.sql.SQLException; import org.junit.Test; impo ...

  3. docker系列四之docker镜像与容器的常用命令

    docker镜像与容器的常用命令 一.概述   docker的镜像于容器是docker中两个至关重要的概念,首先给各位读者解释一下笔者对于这两个概念的理解.镜像,我们从字面意思上看,镜子里成像,我们人 ...

  4. js移动端回退监听 popstate

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. vue语法概要二

    函数 用途 类别 v-html 用于输出html格式的数据 输出 v-bing 用于输出值 输出 v-model 双向绑定 输入和输出 v-if 逻辑判断 分支语句 v-else 同上 分支语句 v- ...

  6. css图片上加文字

    第一种方法: 添加一个DIV,采用绝对定位,图片所属DIV为基准 <div style="position:relative;width:100px;height:100px;&quo ...

  7. 【leetcode】637. Average of Levels in Binary Tree

    原题 Given a non-empty binary tree, return the average value of the nodes on each level in the form of ...

  8. 01 Windows编程——Hello World

    源码 #include "stdafx.h" #include<Windows.h> int WINAPI WinMain(HINSTANCE hInst,HINSTA ...

  9. GAN学习指南:从原理入门到制作生成Demo,总共分几步?

    来源:https://www.leiphone.com/news/201701/yZvIqK8VbxoYejLl.html?viewType=weixin 导语:本文介绍下GAN和DCGAN的原理,以 ...

  10. gorm忽略struct种的field, 不映射到表里面

    https://github.com/jinzhu/gorm/pull/1111/commits/3c01fe791514d7064791a17d8b067106866d1e2f