题目: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的更多相关文章

  1. HDU 5898:odd-even number(数位DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=5898 题意:给出一个区间[l, r],问其中数位中连续的奇数长度为偶数并且连续的偶数长度为奇数的个数.(1< ...

  2. hdu 5898 odd-even number 数位DP

    传送门:hdu 5898 odd-even number 思路:数位DP,套着数位DP的模板搞一发就可以了不过要注意前导0的处理,dp[pos][pre][status][ze] pos:当前处理的位 ...

  3. HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)

    HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...

  4. hdu 6216 A Cubic number and A Cubic Number【数学题】

    hdu 6216 A Cubic number and A Cubic Number[数学] 题意:判断一个素数是否是两个立方数之差,就是验差分.. 题解:只有相邻两立方数之差才可能,,因为x^3-y ...

  5. HDU 1394 Minimum Inversion Number(线段树求最小逆序数对)

    HDU 1394 Minimum Inversion Number(线段树求最小逆序数对) ACM 题目地址:HDU 1394 Minimum Inversion Number 题意:  给一个序列由 ...

  6. HDU 6093 - Rikka with Number | 2017 Multi-University Training Contest 5

    JAVA+大数搞了一遍- - 不是很麻烦- - /* HDU 6093 - Rikka with Number [ 进制转换,康托展开,大数 ] | 2017 Multi-University Tra ...

  7. 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 ...

  8. HDU 5898 odd-even number(2016沈阳网络选拔赛 数位DP)

    定义DP[pos][pre][odd][even],pos代表当前数位,pre代表前一位的数值,odd代表到前一位连续的奇数个数,even代表到前一位连续偶数个数. odd和even肯定至少有一个为0 ...

  9. HDU 5898 odd-even number (数位DP) -2016 ICPC沈阳赛区网络赛

    题目链接 题意:一个数字,它每个数位上的奇数都形成偶数长度的段,偶数位都形成奇数长度的段他就是好的.问[L , R]的好数个数. 题解:裸的数位dp, 从高到低考虑每个数位, 状态里存下到当前位为止的 ...

随机推荐

  1. Cassandra联手Spark 大数据分析将迎来哪些改变?

    2014Spark峰会在美国旧金山举行,与会数据库平台供应商DataStax宣布,与Spark供应商Databricks合作,在它的旗舰产 品 DataStax Enterprise 4.5 (DSE ...

  2. gear gym 思维题

    题目:https://vj.69fa.cn/1fc993e7e0e1e6fa7ce4640b8d46ef8d?v=1552762626 这个题目,之前有一点思路,但是呢,后来又不知道怎么去执行,然后就 ...

  3. 微软刚发布的区块链去中心化身份识别系统DID

    https://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=2653549389&idx=1&sn=158f9feb10d76a ...

  4. JDK动态代理给Spring事务埋下的坑!

    一.场景分析 最近做项目遇到了一个很奇怪的问题,大致的业务场景是这样的:我们首先设定两个事务,事务parent和事务child,在Controller里边同时调用这两个方法,示例代码如下: 1.场景A ...

  5. UVA1623-Enter The Dragon(并查集)

    Problem UVA1623-Enter The Dragon Accept: 108  Submit: 689Time Limit: 3000 mSec Problem Description T ...

  6. spring boot启动后执行方法

    @Componentpublic class InitProject implements ApplicationRunner { private static final Logger logger ...

  7. ubuntu查看安装的pytorch/cuda版本

    使用命令: user@home:~$ python Python |Anaconda custom (-bit)| ( , ::) [GCC ] on linux Type "help&qu ...

  8. docker 15 dockerfile案例-CMD、ENTRYPOINT案例

    CMD.ENTRYPOINT都是指定一个容器启动时要运行的命令.但是CMD会覆盖前面的参数,而ENTRYP会追加组合原来的参数 未完待续...

  9. ssm框架整合+Ajax异步验证

    SSM框架是目前企业比较常用的框架之一,它的灵活性.安全性相对于SSH有一定的优势.说到这,谈谈SSM和SSH的不同点,这也是企业常考初级程序员的面试题之一.说到这两套框架的不同,主要是持久层框架Hi ...

  10. Android开发常用权限设置

    加在AndroidManifest.xml 文件中manifest标签以内,application以外 例如:<!--网络权限 --> <uses-permission androi ...