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, 从高到低考虑每个数位, 状态里存下到当前位为止的 ...
随机推荐
- 从此使用linux系统,但是QQ是必不可少的!!该篇文章方法成功!!!已验证!!!!!
一开始,我在Ubuntu14.04下安装的QQ版本是WineQQ2013SP6-20140102-Longene, 但后来发现这个版本QQ在linux下问题很多,比如不能用键盘输入密码,QQ表情使用失 ...
- .Net下的全局异常捕获问题
全局异常捕获主要目标并不是为了将异常处理掉防止程序崩溃.因为当错误被你的全局异常捕获器抓到的时候,已经证实了你程序中存在BUG. 一般而言,我们的全局异常捕获主要作用就是接收到异常之后进行异常的反馈. ...
- docker学习笔记(四)-持久化数据,安装docker-compose
Docker 持久化数据 实战 compose 安装docker-compose
- 详解区块链P2P网络
根据前一篇文章<从微观到宏观理解区块链>我们已经了解到,微观上,区块链本质就是一种不可篡改且可追踪溯源的哈希链条:宏观上,还具备了另外三个基本特征:分布式存储.P2P 网络和共识机制.分布 ...
- Shiro+JWT+Spring Boot Restful简易教程
序言 我也是半路出家的人,如果大家有什么好的意见或批评,请务必issue下. 项目地址:https://github.com/Smith-Cruise/Spring-Boot-Shiro . 如果想要 ...
- 在ASP.NET MVC中使用Redis
一.Redis基本认知 1.含义: REmote DIctionary Server(Redis) | 是一个key-value存储系统 2.特性: 2.1 持久化:可以将内存中的数据保存在磁盘中,重 ...
- 最长回文(manacher模板)
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> us ...
- 001_HTTP参数中Etag的重要性
在研究tornado时,有个Etag比较好奇,从网上查询摘录如下:
- docker 14 dockerfile自定义mycentos
Base镜像(scratch) Docker Hub中99%的镜像是通过在base镜像中安装和配置需要的软件构建出来的.也就是说base镜像是所有其他镜像的鼻祖. hub默认centos镜像是什么情况 ...
- 【转】从零开始玩转logback
概述 LogBack是一个日志框架,它与Log4j可以说是同出一源,都出自Ceki Gülcü之手.(log4j的原型是早前由Ceki Gülcü贡献给Apache基金会的)下载地址:http://l ...