BCD Code ZOJ - 3494 AC自动机+数位DP
题意:
问A到B之间的所有整数,转换成BCD Code后,
有多少个不包含属于给定病毒串集合的子串,A,B <=10^200,病毒串总长度<= 2000.
BCD码这个在数字电路课上讲了,题干也讲的很详细。
数位DP的实现是通过0~9 ,并不是通过BCD码
所有我们需要先把字串放入AC自动机,建立一个BCD数组
因为BCD码是一个4位二进制数,但是tire图上全是0,1,
所以对于一个数字,我们的要在转移4次,
如果中间出现了病毒串就return -1 表示不能转移,
BCD【i】【j】表示在AC自动机 i 这个节点转移到数字 j 对应的在AC自动机上的节点标号。
然后就是简单的数位DP了,然而我写搓了,由于没有前导0所以前导0要处理掉。
但是你不转移的时候,不能 bcd[idx][i] != -1 就直接continue ,
因为有0的情况,i==0 但是(bcd[idx][i] == -1) 但是这个0是前导0所以不影响。
- #include <set>
- #include <map>
- #include <stack>
- #include <queue>
- #include <cmath>
- #include <ctime>
- #include <cstdio>
- #include <string>
- #include <vector>
- #include <cstring>
- #include <iostream>
- #include <algorithm>
- #define pi acos(-1.0)
- #define eps 1e-9
- #define fi first
- #define se second
- #define rtl rt<<1
- #define rtr rt<<1|1
- #define bug printf("******\n")
- #define mem(a, b) memset(a,b,sizeof(a))
- #define name2str(x) #x
- #define fuck(x) cout<<#x" = "<<x<<endl
- #define sfi(a) scanf("%d", &a)
- #define sffi(a, b) scanf("%d %d", &a, &b)
- #define sfffi(a, b, c) scanf("%d %d %d", &a, &b, &c)
- #define sffffi(a, b, c, d) scanf("%d %d %d %d", &a, &b, &c, &d)
- #define sfL(a) scanf("%lld", &a)
- #define sffL(a, b) scanf("%lld %lld", &a, &b)
- #define sfffL(a, b, c) scanf("%lld %lld %lld", &a, &b, &c)
- #define sffffL(a, b, c, d) scanf("%lld %lld %lld %lld", &a, &b, &c, &d)
- #define sfs(a) scanf("%s", a)
- #define sffs(a, b) scanf("%s %s", a, b)
- #define sfffs(a, b, c) scanf("%s %s %s", a, b, c)
- #define sffffs(a, b, c, d) scanf("%s %s %s %s", a, b,c, d)
- #define FIN freopen("../in.txt","r",stdin)
- #define gcd(a, b) __gcd(a,b)
- #define lowbit(x) x&-x
- #define IO iOS::sync_with_stdio(false)
- using namespace std;
- typedef long long LL;
- typedef unsigned long long ULL;
- const ULL seed = ;
- const LL INFLL = 0x3f3f3f3f3f3f3f3fLL;
- const int maxn = 1e6 + ;
- const int maxm = 8e6 + ;
- const int INF = 0x3f3f3f3f;
- const int mod = ;
- int T, n;
- char buf[maxn], num1[maxn], num2[maxn];
- int bcd[][], bit[maxn];
- LL dp[][];
- struct Aho_Corasick {
- int next[][], fail[], End[];
- int root, cnt;
- int newnode() {
- for (int i = ; i < ; i++) next[cnt][i] = -;
- End[cnt++] = ;
- return cnt - ;
- }
- void init() {
- cnt = ;
- root = newnode();
- }
- void insert(char buf[]) {
- int len = strlen(buf);
- int now = root;
- for (int i = ; i < len; i++) {
- if (next[now][buf[i] - ''] == -) next[now][buf[i] - ''] = newnode();
- now = next[now][buf[i] - ''];
- }
- End[now] = ;
- }
- void build() {
- queue<int> Q;
- fail[root] = root;
- for (int i = ; i < ; i++)
- if (next[root][i] == -) next[root][i] = root;
- else {
- fail[next[root][i]] = root;
- Q.push(next[root][i]);
- }
- while (!Q.empty()) {
- int now = Q.front();
- Q.pop();
- if (End[fail[now]]) End[now] = ;
- for (int i = ; i < ; i++)
- if (next[now][i] == -) next[now][i] = next[fail[now]][i];
- else {
- fail[next[now][i]] = next[fail[now]][i];
- Q.push(next[now][i]);
- }
- }
- }
- int get_num(int cur, int num) {
- if (End[cur]) return -;
- int now = cur;
- for (int i = ; i >= ; --i) {
- if (End[next[now][ & (num >> i)]]) return -;
- now = next[now][ & (num >> i)];
- }
- return now;
- }
- void get_bcd() {
- for (int i = ; i < cnt; ++i)
- for (int j = ; j < ; ++j)
- bcd[i][j] = get_num(i, j);
- }
- LL dfs(int pos, int idx, int flag, int limit) {
- if (pos == -) return ;
- if (!limit && dp[pos][idx] != -) return dp[pos][idx];
- int num = limit ? bit[pos] : ;
- LL ans = ;
- for (int i = ; i <= num; ++i) {
- if (flag && i == ) ans = (ans + dfs(pos - , idx, , limit && i == num)) % mod;
- else if (bcd[idx][i] != -) ans = (ans + dfs(pos - , bcd[idx][i], , limit && i == num)) % mod;
- }
- if (!limit && !flag) dp[pos][idx] = ans;
- return ans;
- }
- LL solve() {
- get_bcd();
- int len1 = strlen(num1), len2 = strlen(num2);
- for (int i = len1-; i>=; --i) {
- if (num1[i] > '') {
- num1[i]--;
- break;
- } else num1[i] = '';
- }
- for (int i = ; i < len1; ++i) bit[i] = num1[len1 - - i] - '';
- LL ans1 = dfs(len1 - , , , );
- for (int i = ; i < len2; ++i) bit[i] = num2[len2 - - i] - '';
- LL ans2 = dfs(len2 - , , , );
- return (ans2 - ans1 + mod) % mod;
- }
- void debug() {
- for (int i = ; i < cnt; i++) {
- printf("id = %3d,fail = %3d,end = %3d,chi = [", i, fail[i], End[i]);
- for (int j = ; j < ; j++) printf("%2d", next[i][j]);
- printf("]\n");
- }
- }
- } ac;
- int main() {
- // FIN;
- sfi(T);
- while (T--) {
- sfi(n);
- ac.init();
- for (int i = ; i < n; ++i) {
- sfs(buf);
- ac.insert(buf);
- }
- ac.build();
- sffs(num1, num2);
- mem(dp, -);
- printf("%lld\n", ac.solve());
- }
- return ;
- }
BCD Code ZOJ - 3494 AC自动机+数位DP的更多相关文章
- 【HDU3530】 [Sdoi2014]数数 (AC自动机+数位DP)
3530: [Sdoi2014]数数 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 682 Solved: 364 Description 我们称一 ...
- 【bzoj3530】[Sdoi2014]数数 AC自动机+数位dp
题目描述 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3223不是幸运 ...
- BZOJ 3530 [SDOI2014]数数 (Trie图/AC自动机+数位DP)
题目大意:略 裸的AC自动机+数位DP吧... 定义f[i][x][0/1]表示已经匹配到了第i位,当前位置是x,0表示没到上限,1到上限,此时数是数量 然而会出现虚拟前导零,即前几位没有数字的情况, ...
- zoj3494 BCD Code(AC自动机+数位dp)
Binary-coded decimal (BCD) is an encoding for decimal numbers in which each digit is represented by ...
- ZOJ 3494 BCD Code(AC自动机+数位DP)
BCD Code Time Limit: 5 Seconds Memory Limit: 65536 KB Binary-coded decimal (BCD) is an encoding ...
- ZOJ 3494 BCD Code(AC自动机 + 数位DP)题解
题意:每位十进制数都能转化为4位二进制数,比如9是1001,127是 000100100111,现在问你,在L到R(R <= $10^{200}$)范围内,有多少数字的二进制表达式不包含模式串. ...
- ZOJ 3494 (AC自动机+高精度数位DP)
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3494 题目大意:给定一些被禁止的BCD码.问指定范围内不含有 ...
- zoj3494BCD Code(ac自动机+数位dp)
l链接 这题想了好一会呢..刚开始想错了,以为用自动机预处理出k长度可以包含的合法的数的个数,然后再数位dp一下就行了,写到一半发现不对,还要处理当前走的时候是不是为合法的,这一点无法移到trie树上 ...
- BZOJ3530:[SDOI2014]数数(AC自动机,数位DP)
Description 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3 ...
随机推荐
- HashMap 介绍
基本介绍 1. 用于存储Key-Value键值对的集合(每一个键值对也叫做一个Entry)(无顺序). 2. 根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值. 3. 键key为n ...
- 【Tomcat】Tomcat调优
Tomcat的默认配置,性能并不是最优的,我们可以通过优化tomcat以此来提高网站的并发能力.提高Tomcat的性能可以分为两个方向. 服务器资源 服务器所能提供CPU.内存.硬盘的性能对处理能力有 ...
- JavaWeb学习篇之----Tomcat中配置数字证书以及网络传输数据中的密码学知识
今天是学习JavaWeb的第二天,我们来了解什么呢?就了解一下Tomcat中配置数字证书的相关内容,但是在说这部分内容的时候,我们貌似得先说一下数字证书的相关概念,那说到数字证书的时候我们还得了解一些 ...
- NX二次开发-UFUN获得图纸页数量UF_DRAW_ask_num_drawings
#include <uf.h> #include <uf_draw.h> #include <uf_ui.h> UF_initialize(); //获得有多少张图 ...
- Unity中的值传递与引用传递
1. 值类型 值类型变量本身保存了该类型的全部数据,当声明一个值类型的变量时,该变量会被分配到栈(Stack)上. 2. 引用类型 引用类型变量本身保存的是位于堆(Heap)上的该类型的实例的内存地址 ...
- 杂项-Class:Class
ylbtech-杂项-Class:Class 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 作者:ylbtech出处:http://y ...
- 装hadoop的第一步,装ubuntu并换源并装jdk
如何装ubuntu,这个自己百度.具体安装网站:http://www.ubuntu.com 我安装的是ubuntu Server版本的,然后是全英文安装.所以它的源自动定位到美国 下面是如何换源的,第 ...
- scp 传输下载
利用scp传输文件 1.从服务器下载文件 scp username@servername:/path/filename /tmp/local_destination 例如scp codinglog@1 ...
- HTML和CSS标签命名规则
1.Images 存放一些网站常用的图片: 2.Css 存放一些CSS文件: 3.Flash 存放一些Flash文件: 4.PSD 存放一些PSD源文件: 5.Temp 存放所有临时图片和其它文件: ...
- CSV导入到hive中,处理分号问题
1.导入的原数据 103744;545479945;2017.05.17 06:41:08;sell;eurusd_;0.10;1.11080;1.11280;1.10880;1.11081;0.00 ...