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所以不影响。 1 #include <set> 2 #include <map> 3 #include <stack> 4 #include <queue> 5 #include <cmath> 6 #include <ctime> 7 #include <cstdio> 8 #include <string> 9 #include <vector> 10