HDU 5898 odd-even number
题目:odd-even number
链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5898
题意:给一个条件,问l 到r 之间有多少满足条件的数,条件是:连续的奇数长度为偶数,连续的偶数长度为奇数,比如124683,连续的奇数(1、3)长度都是1(奇数),连续的偶数(2468)长度为4(偶数),所以不满足条件。
思路:
很明显的数位dp,可以用dfs做,传下三个参数(pre、p1、p2、ceng),pre表示前一位的数是奇数还是偶数,p1表示前面连续的奇数个数,p2表示前面连续的偶数的个数(p1、p2至少有一个为0),ceng表示还需dfs几位。如果ceng是0,那就判断,pre是偶数p2为奇数、pre是奇数p1是偶数返回1,否则返回0。如果ceng不为0,则分情况递归,比如pre为1且p1为奇数,则这一位不能选择偶数......
然后就是根据具体的数调用dfs求数量。
注意:区间超过longlong,要用字符串存。
AC代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<set>
#include<map>
#include<list>
#include<stack>
#include<queue>
#include<vector>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
#define lson rt<<1
#define rson rt<<1|1
#define N 20020
#define M 100010
#define Mod 1000000007
#define LL long long
#define INF 0x7fffffff
#define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;i++)
#define For(i,f_start,f_end) for(int i=f_start;i<f_end;i++)
#define REP(i,f_end,f_start) for(int i=f_end;i>=f_start;i--)
#define Rep(i,f_end,f_start) for(int i=f_end;i>f_start;i--)
#define MT(x,i) memset(x,i,sizeof(x))
#define gcd(x,y) __gcd(x,y)
const double PI = acos(-); LL dfs(int pre,int p1,int p2,int ceng)
{
if(ceng == )
{
if(p1== && p2==) return ;
else if(pre== && p2%==) return ;
else if(pre==) return ;
else if(pre== && p1%==) return ;
else return ;
}
LL ret;
if(p1== && p2==){
ret = dfs(,,,ceng-);
ret += dfs(,,p2+,ceng-)*;
ret += dfs(,p1+,,ceng-)*; }
else if(pre== && p2%==){
ret=dfs(,,p2+,ceng-);
ret = ret * ;
}
else if(pre== && p2%==){
ret=dfs(,,p2+,ceng-)*;
ret+=dfs(,p1+,,ceng-)*;
}
else if(pre== && p1%==){
ret=dfs(,p1+,,ceng-)*;
}
else if(pre== && p1%==){
ret=dfs(,p1+,,ceng-)*;
ret+=dfs(,,p2+,ceng-)*;
}
return ret;
} bool ok(char *x)
{
if(x[]=='' && x[]==) return true;
int pre = , p1 = , p2 = ;
int len=strlen(x)-;
while(len>=)
{
int tmp = (x[len]-'')%;
if(p1== && p2==);
else if(tmp == && pre== && p1%==) return false;
else if(tmp == && pre== && p2%==) return false;
if(tmp == ) p2++,p1=;
else p1++,p2=;
pre=tmp;
len--;
}
if(pre== && p2%==) return false;
if(pre== && p1%==) return false;
return true;
} bool ok(int x)
{
if(x==) return true;
int pre = , p1 = , p2 = ;
while(x)
{
int tmp = x%%;
if(p1== && p2==);
else if(tmp == && pre== && p1%==) return false;
else if(tmp == && pre== && p2%==) return false;
if(tmp == ) p2++,p1=;
else p1++,p2=;
pre=tmp;
x/=;
}
if(pre== && p2%==) return false;
if(pre== && p1%==) return false;
return true;
} LL solve(char *x)
{
LL ret = ;
if(ok(x)){
ret++;
}
int bt[],bo=;
while(x[bo])
{
bt[bo]=x[bo]-'';
bo++;
}
int tmp = ;
while(tmp<=(bo-)/){
int tt = bt[tmp];
bt[tmp]=bt[bo-tmp-];
bt[bo-tmp-]=tt;
tmp++;
}
int pre = , p1 = , p2 = ;
for(int i=bo-;i>=;i--)
{
if(bt[i]>)
{
if(p1 == && p2==)
ret += dfs(pre,,,i);
else
{
if(pre == && p1 % == );
else ret += dfs(,,p2+,i);
}
}
for(int j=;j<bt[i];j++)
{
if(j%==){
if((p1!= || p2!=) && pre == && p2 % == ) continue;
else ret += dfs(,p1+,,i);
}
else
{
if(pre == && p1 % == ) continue;
ret += dfs(,,p2+,i);
}
}
if(p1== && p2==);
else if(bt[i]%== && pre== && p1%==) break;
else if(bt[i]%== && pre== && p2%==) break;
pre = bt[i]%;
if(pre==) p2++,p1=;
else p1++,p2=;
}
return ret;
} int main()
{
int t;
char l[],r[];
int cas=;
scanf("%d",&t);
while(t--){
scanf("%s%s",l,r);
printf("Case #%d: ",cas++);
printf("%I64d\n",solve(r)-solve(l)+(ok(l)?:));
}
return ;
}
HDU 5898 odd-even number的更多相关文章
- HDU 5898:odd-even number(数位DP)
http://acm.hdu.edu.cn/showproblem.php?pid=5898 题意:给出一个区间[l, r],问其中数位中连续的奇数长度为偶数并且连续的偶数长度为奇数的个数.(1< ...
- hdu 5898 odd-even number 数位DP
传送门:hdu 5898 odd-even number 思路:数位DP,套着数位DP的模板搞一发就可以了不过要注意前导0的处理,dp[pos][pre][status][ze] pos:当前处理的位 ...
- HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)
HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...
- hdu 6216 A Cubic number and A Cubic Number【数学题】
hdu 6216 A Cubic number and A Cubic Number[数学] 题意:判断一个素数是否是两个立方数之差,就是验差分.. 题解:只有相邻两立方数之差才可能,,因为x^3-y ...
- HDU 1394 Minimum Inversion Number(线段树求最小逆序数对)
HDU 1394 Minimum Inversion Number(线段树求最小逆序数对) ACM 题目地址:HDU 1394 Minimum Inversion Number 题意: 给一个序列由 ...
- HDU 6093 - Rikka with Number | 2017 Multi-University Training Contest 5
JAVA+大数搞了一遍- - 不是很麻烦- - /* HDU 6093 - Rikka with Number [ 进制转换,康托展开,大数 ] | 2017 Multi-University Tra ...
- hdu 5898 odd-even number(数位dp)
Problem Description For a number,if the length of continuous odd digits is even and the length of co ...
- HDU 5898 odd-even number(2016沈阳网络选拔赛 数位DP)
定义DP[pos][pre][odd][even],pos代表当前数位,pre代表前一位的数值,odd代表到前一位连续的奇数个数,even代表到前一位连续偶数个数. odd和even肯定至少有一个为0 ...
- HDU 5898 odd-even number (数位DP) -2016 ICPC沈阳赛区网络赛
题目链接 题意:一个数字,它每个数位上的奇数都形成偶数长度的段,偶数位都形成奇数长度的段他就是好的.问[L , R]的好数个数. 题解:裸的数位dp, 从高到低考虑每个数位, 状态里存下到当前位为止的 ...
随机推荐
- 一个特别好用的属性:inline-block
说起inline-block,大家都不陌生,如果我要保证:有一个内联元素,保证它换行时,不被截断,而要整体换行,那么设置:display:inline-block 即可
- MySQL高级知识(九)——慢查询日志
前言:慢查询日志是MySQL提供的一种日志记录,它记录MySQL中响应时间超过阈值的语句,具体指运行时间超过long_query_time值的sql语句,该sql语句会被记录到慢查询日志中.慢查询日志 ...
- 【NOI2019模拟】搬砖
[NOI2019模拟]搬砖 Description 小火车很穷,只好去搬砖了. 小火车被工头要求搭建\(n\)座塔,第i个高度为\(H_i\),也就是由\(H_i\)块砖头组成.每次小火车可以携带至多 ...
- nginx学习笔记(二)
tail -f /var/log/nginx/access.log 查看nginx访问日志 安装ab压测工具 连接限制只有公有云才能测出,虚拟机只能测请求限制 添加用户 覆盖用户 新增用户 文件是配置 ...
- Python 抖音机器人,论如何在抖音上找到漂亮小姐姐?
只有想不到,没有做不到,最近抖音风靡好友圈,马上就有技术宅本着“代码改变世界”的理念开始了搞事之路. 需要注意的事,漂亮不漂亮没有明确的界限,每个人都有每个人的审美,只有外表而没有心灵的美也是空洞的. ...
- SQL Access Advisor in Oracle Database 10g
The SQL Access Advisor makes suggestions about indexes and materialized views which might improve sy ...
- P2708 硬币翻转(简单模拟)
题意:弱鸡,其实题意是1到i都变化.然后把所有的硬币都变到正面. 简单的模拟: 思路:本质就是记录相邻字符的有几组不同,比如11010,则就有3组不同,但是,这样变化出来的字符串是00000,所以需要 ...
- 兼容Android 和 ios JavaScript copy paste
<!DOCTYPE html> <html> <head> <title>关于我们Frame</title> <meta charse ...
- 【转】bios与CMOS有什么区别
正确的解释应该是: BIOS是软件.是程序! CMOS是芯片.是硬件! 实际上我们是通过BIOS这个程序,去设置CMOS里的参数的. CMOS是一块芯片,集成在主板上,里面保存着重要的开机参数,而保存 ...
- 在JS中调用CS里的方法(PageMethods)
在JS中调用CS里的方法(PageMethods) 2014年04月28日 11:18:18 被动 阅读数:2998 最近一直在看别人写好的一个项目的源代码,感觉好多东西都是之前没有接触过的.今天 ...