题意

询问区间[a,b]中的Mirror Number的个数,其中Mirror Number是指把它横着翻转后还能表示同样的数字。

思路

注意这个可不是回文数。。除了0,1,8,别的数字翻转过后就不是数字了。所以策略就是记忆化按位搜索,每位只搜0,1,8,最后再判断是否回文,统计即可。这个判断回文是个小麻烦,因为它需要和前面的位相比较,所以用一个全局数组tmp[]表示枚举的每位的数字。

回过头来我觉得设置全局变量似乎不是一个好方法……它应该会破坏DP数组的区间唯一性……

代码

[cpp]
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#define MID(x,y) ((x+y)/2)
#define MEM(a,b) memset(a,b,sizeof(a))
#define REP(i, begin, end) for (int i = begin; i <= end; i ++)
using namespace std;

typedef long long LL;
typedef vector VI;
typedef set SETI;
typedef queue QI;
typedef stack SI;

char num[50];
LL dp[47][47][2];
int tmp[50];
LL dfs(int pos, int start, bool flag, bool limit){
if (pos==-1) return flag;
if (!limit && ~dp[pos][start][flag]) return dp[pos][start][flag];
int end = limit?(num[pos]-48):9;
LL res = 0;
for (int i = 0; i <= end; i ++)
if (i == 0 || i == 1 || i == 8){
bool st = (start==pos && i == 0);
bool next_flag = flag;
if (flag){
if (!st && pos < (start+1)/2)
next_flag = (i == tmp[start-pos]);
}
tmp[pos] = i;
res += dfs(pos-1, st?start-1:start, next_flag, limit&&(i==end));
}
return limit ? res : dp[pos][start][flag] = res;
}
LL solve(char x[]){
int len = strlen(x);
for (int i = 0; i < len; i ++){
num[i] = x[len-1-i];
}
num[len] = 0;
return dfs(len-1, len-1, 1, 1);
}
int main(){
//freopen("test.in", "r", stdin);
//freopen("test.out", "w", stdout);
int t;
char a[50], b[50];
scanf("%d", &t);
getchar();
MEM(dp, -1);
while(t --){
scanf("%s %s", a, b);
LL res = solve(b)-solve(a);
int len = strlen(a);
bool ok = true;
for (int i = 0; i < len; i ++){
if ((a[i] != '0' && a[i] != '1' && a[i] != '8')||(a[i] != a[len-1-i])){
ok = false;
break;
}
}
if (ok)
res ++;
printf("%lld\n", res);
}
return 0;
}
[/cpp]

最新文章

  1. HTTP状态码(HTTP Status Code)
  2. ionic2 图片上传
  3. java_method_stringUtils
  4. [ACM_数学] Fibonacci Nim(另类取石子,2-4组合游戏)
  5. Python 字典(Dictionary)操作详解
  6. ZooKeeper 安装部署及hello world
  7. 【剑指Offer学习】【面试题43 : n 个锻子的点数】
  8. HDU 4362 Dragon Ball 线段树
  9. CC++初学者编程教程(14) Redhat linux安装Oracle12c
  10. python 标准库 -- signal
  11. http_load压力测试windows版使用方法及结果分析
  12. c的文件流读取
  13. Linux显示所有运行中的进程
  14. 【Python】 魔法方法
  15. python之进程,线程,协程简单理解
  16. megacli安装使用
  17. Django的下载安装以及实现一个简单示例
  18. UDP与TCP
  19. Javascript中变量提升的问题(五)
  20. Do in SDN

热门文章

  1. Zen-cart产品页面随机调用Wordpress文章
  2. atheros无线驱动之:数据接收流程
  3. django之路由(url)
  4. 滑块控件CCControlSlider
  5. TOSCA自动化测试工具--识别元素唯一性的控件
  6. ROS学习
  7. 编写和运行简单的&quot;Hello World&quot;操作系统内核
  8. CentOS的Qt3和Qt4问题
  9. tomcat结合memcached构建session服务器
  10. VMware 共享目录不显示的解决办法