ZOJ Problem Set - 3494 BCD Code AC自动机+数位DP

STM32 野火MINI 用FontCvtST.exe 生成.c文件 写汉字到文本框 按钮上 STM32 野火MINI 用FontCvtST.exe 生成.c文件 写汉字到文本框 按钮上 参考了好多大神博客,自己写的过程中发现,还有些小细节。 一、打开Notepad写需要的字 另存为 UTF-16LE 也就是Unicode。 二、打开FontCvtST转 删掉所有字 读入test.txt里的字 选择刚才的test.txt 另存为.c文件 改个英文名 复制到RTOS的例程文件夹下 三、打开GUIBuilder 画一个这样的 保存之前要注意路径配置要在当前位置,否则存不上 生成的D 阅读详情

BCD Code

Time Limit: 5 Seconds      Memory Limit: 65536 KB

Binary-coded decimal (BCD) is an encoding for decimal numbers in which each digit is represented by its own binary sequence.To encode a decimal number using the common BCD encoding, each decimal digit is stored in a 4-bit nibble:

Decimal:    0     1     2     3     4     5     6     7     8     9
BCD:     0000  0001  0010  0011  0100  0101  0110  0111  1000  1001

Thus, the BCD encoding for the number 127 would be:

 0001 0010 0111

We are going to transfer all the integers from A to B, both inclusive, with BCD codes.But we find that some continuous bits, named forbidden code, may lead to errors. If the encoding of some integer contains these forbidden codes, the integer can not be transferred correctly.Now we need your help to calculate how many integers can be transferred correctly.

Input

There are multiple test cases. The first line of input is an integer T ≈ 100 indicating the number of test cases.

The first line of each test case contains one integer N, the number of forbidden codes ( 0 ≤ N ≤ 100).Then N lines follow, each of which contains a 0-1 string whose length is no more than 20.The next line contains two positive integers A and B. Neither A or B contains leading zeros and 0 < A ≤ B < 10200.

Output

For each test case, output the number of integers between A and B whose codes do not contain any of the N forbidden codes in their BCD codes.For the result may be very large, you just need to output it mod 1000000009.

Sample Input

3
1
00
1 10
1
00
1 100
1
1111
1 100

Sample Output

3
9
98

  BCD码是每个数字用4位2进制表示,[A,B]区间内有多少个数的BCD码不包含给的串。

  很少写数位DP,也几乎没怎么写过记忆化搜索的形式(虽然一般都推荐这么写),嗯,这题挺好的。

  先用AC自动机处理出bcd[i][j],表示在节点i,下一个数字为j到达的节点。

  DP的时候,cur是当前位,s是当前节点,e为是否到达边缘,也决定了这一位能取多大,z是处理前导0,dp[cur][s]是在e为0并且z为0的情况。

  区间为[A,B],那么需要A-1,字符串处理A-1。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<iostream>
#include<queue>
using namespace std;

typedef long long LL;

const int MAXN=110;
const int MAXM=25;
const int MAXL=210;
const int MAXNODE=MAXN*MAXM;
const int LOGMAXN=50;
const int INF=0x3f3f3f3f;
const int SIGMA_SIZE=2;
const int MOD=1000000009;

int T,N;
int bcd[MAXNODE][12];
int num[MAXL];
char str[MAXL];
LL dp[MAXL][MAXNODE];

struct AC{
    int ch[MAXNODE][SIGMA_SIZE];
    int val[MAXNODE];
    int f[MAXNODE];
    int sz;

    void clear(){
        memset(ch[0],0,sizeof(ch[0]));
        val[0]=0;
        sz=1;
    }
    int idx(char c){
        return c-'0';
    }
    int insert(char* s,int v){
        int u=0;
        for(int i=0;s[i];i++){
            int c=idx(s[i]);
            if(!ch[u][c]){
                memset(ch[sz],0,sizeof(ch[sz]));
                val[sz]=0;
                ch[u][c]=sz++;
            }
            u=ch[u][c];
        }
        val[u]=v;
    }
    void get_fail(){
        queue<int> q;
        f[0]=0;
        for(int c=0;c<SIGMA_SIZE;c++){
            int u=ch[0][c];
            if(u){
                f[u]=0;
                q.push(u);
            }
        }
        while(!q.empty()){
            int r=q.front();
            q.pop();
            for(int c=0;c<SIGMA_SIZE;c++){
                int u=ch[r][c];
                if(!u){
                    ch[r][c]=ch[f[r]][c];
                    continue;
                }
                q.push(u);
                f[u]=ch[f[r]][c];
                val[u]|=val[f[u]];
            }
        }
    }
}ac;

void get_bcd(){
    memset(bcd,-1,sizeof(bcd));
    for(int i=0;i<ac.sz;i++)
        for(int j=0;j<10;j++){
            int u=i,flag=1;
            for(int k=3;k>=0;k--){
                int c;
                if(j&(1<<k)) c=1;
                else c=0;
                if(ac.val[ac.ch[u][c]]){
                    flag=0;
                    break;
                }
                u=ac.ch[u][c];
            }
            if(flag) bcd[i][j]=u;
        }
}

LL dfs(int cur,int s,int e,int z){
    if(cur<0) return 1;
    if(!e&&dp[cur][s]!=-1) return dp[cur][s];
    LL ans=0;
    if(z) ans=(ans+dfs(cur-1,s,e&&num[cur]==0,1))%MOD;
    else if(bcd[s][0]!=-1) ans=(ans+dfs(cur-1,bcd[s][0],e&&num[cur]==0,0))%MOD;
    int end=e?num[cur]:9;
    for(int i=1;i<=end;i++) if(bcd[s][i]!=-1){
        ans=(ans+dfs(cur-1,bcd[s][i],e&&i==end,0))%MOD;
    }
    if(!e&&!z) dp[cur][s]=ans;
    return ans;
}

int main(){
    freopen("in.txt","r",stdin);
    scanf("%d",&T);
    while(T--){
        scanf("%d",&N);
        ac.clear();
        for(int i=0;i<N;i++){
            scanf("%s",str);
            ac.insert(str,1);
        }
        ac.get_fail();
        get_bcd();
        memset(dp,-1,sizeof(dp));
        scanf("%s",str);
        int len=strlen(str);
        for(int i=len-1;i>=0;i--){
            if(str[i]>'0'){
                str[i]--;
                break;
            }
            else str[i]='9';
        }
        reverse(str,str+len);
        for(int i=0;i<len;i++) num[i]=str[i]-'0';
        LL ans=0;
        ans-=dfs(len-1,0,1,1);
        scanf("%s",str);
        len=strlen(str);
        reverse(str,str+len);
        for(int i=0;i<len;i++) num[i]=str[i]-'0';
        ans+=dfs(len-1,0,1,1);
        ans=(ans+MOD)%MOD;
        printf("%lld\n",ans);
    }
    return 0;
}


WPF的基础设施:XAML基础语法 XAML是WPF的核心标记语言,采用XML语法实现界面与逻辑分离。其基础语法包括:1)控件声明方式(特性语法和属性元素语法);2)x:Name与Name的区别(适用范围和编译行为);3)注释规范与代码折叠技巧;4)实用特性如属性继承、附加属性等。文章还提供了常见错误排查方法,建议通过实践练习掌握XAML开发技巧。全文系统介绍了XAML的核心语法与应用场景,是WPF开发者的基础学习指南。 阅读详情

相关推荐

UE5导入MetaHuman虚拟头像后,连接live link face,面部表情捕捉出错修正

UE5 利用live link face 驱动meta human面部表情捕捉

m0_53122690的博客 6595

ZOJ - 3494 BCD Code(AC自动机+数位DP)

BCD Code Time Limit: 5 Seconds Memory Limit: 65536 KBBinary-coded decimal (BCD) is an encoding for decimal numbers in which each digit is represented by its own binary sequence. To encode a decim

龙崎的专栏 740

基于matlab的车牌识别(含子程序)

基于matlab的车牌识别系统一、对车辆图像进行预处理1.载入车牌图像:function [d]=main(jpg) [filename, pathname] = uigetfile({'*.jpg', 'JPEG 文件(*.jpg)'}); if(filename == 0), return, end global FILENAME %定义全局变量 FILENAME = [pathname f...

TuTu998的博客 4万+

ZOJ 3494 BCD Code

AC自动机 + 数位DP题目大意:就是现在有0~9对应的BCD码(就是对应的4位的二进制), 然后给出了n串(0 &lt;= n &lt;= 1000)不能出现的串(只包含0和1), 现在问在数字A到B之间有多少个数在转换成BCD码表示之后不包含这n个串,1 &lt;= A &lt;= B &lt;= 10^200大致思路:首先将所有的不能出现的串建立一个ac自动机,然后用end数组表示某个节点是...

early-youth的博客 335

DeepL Pro免费使用技巧与API调用优化方案

机器翻译技术通过神经网络模型实现跨语言语义转换,其核心价值在于保持专业术语准确性的同时实现自然语言流畅度。现代翻译工具如DeepL采用注意力机制等深度学习技术,在医疗、法律等专业领域展现出接近人工翻译的质量。针对API调用场景,开发者可通过请求模拟实现小批量自动化处理,而文档预处理和术语库优化则能显著提升免费额度使用效率。本文重点解析如何通过字符计算优化、临时接口调用等工程实践方法,在合规前提下最大化利用免费翻译资源。

weixin_29038303的博客 266

在Android Jetpack Compose中实现夜间模式

Android基于Compose的深色主题实现

虎哥LoveDroid 1237

ZOJ 3494 BCD Code AC自动机 + 数位DP

题目大意: 就是现在有0~9对应的BCD码(就是对应的4位的二进制), 然后给出了n串(0 大致思路: 首先考虑到A和B的范围,暴力是不可行的,这里需要用到数位DP,也就是逐位确定的思想,首先用AC自动机算出从状态i出发下一位是0~9分别可到达的状态,或者不可走,然后逐位确定各个数位的值即可,记忆化搜索提高效率,启示这个数位DP还是挺简单的,注意前导零的问题即可。 代码如

Gatevin的专栏 1074

Chrome更新出现错误代码3: 0X80070422 -- system level的解决方案

本文主要介绍了Chrome更新出现错误代码3: 0X80070422 – system level的解决方案,希望能对使用Chrome的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

ZOJ 3494 BCD Code(AC自动机+数位DP)

BCD CodeTime Limit: 5 Seconds      Memory Limit: 65536 KB Binary-coded decimal (BCD) is an encoding for decimal numbers in which each digit is represented by its own binary sequence. To encode a deci...

weixin_34166847的博客 143

【银河麒麟服务器操作系统】安装英伟达4090D显卡驱动操作指南

本文详细介绍了在银河麒麟高级服务器操作系统V10SP3-2403-X86版本上安装NVIDIA RTX4090D显卡驱动的完整流程。主要内容包括:准备工作检查、开源驱动禁用、运行级别切换、依赖包安装以及交互式安装过程中的关键选项选择(32位库选Yes、X配置选No)。通过禁用nouveau驱动、重建内核引导等步骤确保驱动安装成功,最后通过nvidia-smi命令验证驱动安装情况。文档提供了操作检查表和安装流程图,帮助用户在银河麒麟系统上顺利完成显卡驱动部署。

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 3104

Vue Vben Admin 登录页修改全攻略:从登录界面定制到接口对接全流程配置

方式一:修改国际化文件找到对应的语言包文件,修改和的值。方式二:直接传递文本page-description="现代化的后台管理系统模板"page-title="欢迎使用 Vue Vben Admin"从上面的代码可以看出,登录表单使用了的方式来定义表单字段,这种方式提供了极大的灵活性。如果你想要自定义表单,可以修改formSchema数组。如果你的登录需求非常特殊,现有的组件无法满足,你可以完全自定义表单。只需在login.vue中替换<template><h2>自定义登录</h2>

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 479

ZOJ3494: BCD Code 题解

要使得数字的每一位二进制表示连起来的字符串中不出现某些给定的字符串,这是AC自动机+dp的模板题所以我们考虑数位dp,dp[i][0/1]表示当前考虑到十进制数的第i位,在AC自动机上的第j号节点,当前数是否紧贴上界的合法数的个数在AC自动机上判断一下是否合法,然后转移就好注意卡常数(比如提前对AC自动机的每个节点预处理好是否危险,再例如提前预处理从AC自动机的j出发加十进制位i会走到哪里)#in...

IcePrincess_1968's World 327

【Clickhouse】Clickhouse写入报错keeper server rejected the connection during the handshake

我的clickhouse集群时不时的报这个错误All connection tries failed while connecting to ZooKeeper. nodes: xxx 到时写入数据失败 用的ck自带的keeper。你需要仔细检查ZooKeeper集群的配置和状态,确保所有节点都正常运行,并且能够正确地选举领导者。检查ZooKeeper的ACL以及ClickHouse连接所使用的凭据,确保它们被正确配置和授权。版本不兼容:有时,不同版本的软件之间可能存在不兼容性,导致连接问题。

九师兄 372

zoj 3494 BCD Code

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4317 题目大意:求a到b之间的数满足翻译成bcd码后没有禁止串的个数。 题目思路:ac自动机加按位dp,需要注意的是,一般在a的长度比b短时,我们会进行加零处理,这样由于0是不存在的,匹配的时候前导0也不能进行匹配,需要特殊判断一下。 #include&lt;s...

java开发指南博客 【转载】 166

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ZOJ 3494 BCD Code AC自动机+数位dp

Binary-coded decimal (BCD) is an encoding for decimal numbers in which each digit is represented by its own binary sequence. To encode a decimal number using the common BCD encoding, each decimal digi...

~不可描述~ 304

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

ZOJ-3494 BCD Code (ac自动机+数位dp)

title: ZOJ-3494 BCD Code (ac自动机+数位dp) date: 2018-10-06 22:32:51 tags: [数位dp, AC自动机] categories: ACM 题目链接 Problem Description Binary-coded decimal (BCD) is an encoding for decimal numbers in which ea...

Running Bit. 639

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

zoj 3494 BCD Code(AC自动机+数位dp)

题目链接:zoj 3494 BCD Code 题目大意:给定n个2进制串,然后有一个区间l,r,问说l,r之间有多少个数转换成BCD二进制后不包含上面的2进制串。 解题思路:AC自动机+数位dp。先对禁止串建立AC自动机,所有的单词节点即为禁止通行的节点。接着进行数位dp, dp[i][j]表示第i为移动到节点j的可行方案数,每次枚举下一位数字,因为是BCD二进制,所以每位数要一

不慌不忙、不急不躁 1560

ZOJ 3494 AC自动机+数位DP

题意有一种BCD编码方案,求A到B范围内的数字的BCD编码有多少个不包含不能包含的字符串。题解数字范围这么大,很明显就能看出来是数位DP。基于AC自动机的数位DP使得数位DP容易了不少,因为AC自动机自带状态转移。在数位DP选取每一位的时候,基于AC自动机状态转移一下,如果转移到不能转移的状态,就直接返回-1。如果转移到合法状态,就继续DFS。唯一需要注意的就是需要大整数的减法,不过随便写写就行了,

zhenlingcn的博客 384

zoj 3494

数位dp+ac自动机 #include #include #include #include #define mod 1000000009 #define N 2010 typedef long long ll; using namespace std; char s[210]; int next[N][2],nextd[N][10],pos,flag[N],fail[N]; ll dp

1292765944的专栏 1319

ZOJ 3494 BCD Code (AC自动机+数位DP,5级)

BCD Code Time Limit: 5 Seconds      Memory Limit: 65536 KB Binary-coded decimal (BCD) is an encoding for decimal numbers in which each digit is represented by its own binary sequence. To enco

nealgavin的专栏 1185

zoj3494AC自动机

#include #include #include #include #include #include #include #include #include typedef long long LL ; const int nodeSize = 2008 ; const int alphaSize = 2 ; const LL mod = 1000000009LL ; v

老李2009 460

ZOJ 3494 BCD Code AC自动机+数位DP

【题目大意】

ACMmaxx的专栏 755

ZOJ3494--BCD Code(AC自动机+数位DP)

题意:有T组测试数据每组一个整数n代表有n个不合格的二进制编码,将所有数字转化为BCD码 判断区间l,r之间有多少合格的数字 (一个数只要转化为BCD码后中间有不合格的BCD码该数据就不合格) 题解:先用AC自动机将不合格二进制串处理好然后定义一个bcd[i][j]二维数组 表示在数字中前一个数为AC自动机树上的节点i时下一个位数为j(0~9)时合不合法 为-1表示不合法; dp[i...

Dog_dream的博客 455

zoj 3494 BCD Code (ac自动机+数位dp)

题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4317 题意:给定N个01串,再给定区间[a,b],问区间[a,b]里面有多少个数转化成BCD码之后不包含任何前面给出01串。 分析:首先将01串建ac自动机,然后把不可到达的点标记出来。用二维数组Matrix[][]把状态转移图(比如Matirx[cur][x

w20810的专栏 1014

zoj 3494(ac自动机+数位dp)

题意:从0到9都用4位的二进制数表示,叫做BCD码,给出n个模式串,是不能出现的串,给出整数A和整数B,A <= B,问从A到B所有数字化为化成BCD码,问多少个数字的BCD码中没有任何模式串。 题解:0 <= A <= B <= 2^200,位数有200位,可以用数位dp来处理,先用自动机把所有模式串都存到trie图中,然后预处理出bcd[i][j]表示节点i添加的数字是j将会跳到的节点,在数位

俯瞰风景 768

ZOJ Problem Set - 3819Average Score

ZOJ Problem Set - 3819Average Score 题目链接 题目大意:给你两个班的的学生的分数(A,B班),A班有一个学生的分数没有给出。现在要求你给出这个学生分数的上下限,使得这个学生的分数满足把这个学生拿出A班放到B班,两个班的平均分都提高。 解题思路: Sa:代表A班的学生除了要求的那种学生的总分;Sb:代表B班同学的学生的总分; n:代表A班学生

1156
上一篇: hdu3247 Resource Archiver AC自动机+状态压缩DP
下一篇: uva10441 - Catenyms 欧拉通路
小小小小葱
博客等级 码龄14年 22粉丝 266原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值