bzoj3530
比较恶心的题目
不难发现是在自动机上做数位dp
注意要考虑前导0,题目中给出的233是幸运数,20233不是
为此我非常猥琐的写了一个四维dp,用记忆化搜索实现
const mo=;
var dp:array[..,..,..,..] of longint;
trie:array[..,''..''] of longint;
q,f:array[..] of longint;
can:array[..] of boolean;
ans,i,n,m,t,j,k,l:longint;
s,ss:ansistring;
ch:char; procedure ac;
var h,r,i,x,y:longint;
c:char;
begin
h:=;
r:=;
for c:='' to '' do
if trie[,c]> then
begin
inc(r);
q[r]:=trie[,c];
end; while h<=r do
begin
x:=q[h];
for c:='' to '' do
if trie[x,c]> then
begin
y:=trie[x,c];
inc(r);
q[r]:=y;
j:=f[x];
while (j>) and (trie[j,c]=) do j:=f[j];
f[y]:=trie[j,c];
if can[trie[j,c]] then can[y]:=true; //注意
end;
inc(h);
end;
end; function calc(p,z,i,j:longint):longint; //p表示当前位置上的数是否需要小于N当前位上的数
//z表示假如当前位出现0,是否是多余的0
var k,q,zz:longint;
s,c,e:char;
begin
if can[j] then exit();
if i=m then exit();
if dp[p,z,i,j]<>- then exit(dp[p,z,i,j]);
dp[p,z,i,j]:=;
if p= then e:=ss[i+] else e:='';
for c:='' to e do
begin
if (p=) and (c=e) then q:=
else q:=;
k:=j;
while k>- do
begin
if trie[k,c]> then break;
k:=f[k];
end;
if k=- then k:= else k:=trie[k,c];
if (z=) and (c='') then //开头多余的0不考虑
begin
zz:=;
k:=; //多余的0不在自动机上匹配
end
else zz:=;
dp[p,z,i,j]:=(dp[p,z,i,j]+calc(q,zz,i+,k)) mod mo;
end;
exit(dp[p,z,i,j]);
end; begin
read(ch);
while ch='' do read(ch);
readln(ss);
ss:=ch+ss;
m:=length(ss);
f[]:=-;
readln(n);
for i:= to n do
begin
readln(s);
j:=;
l:=length(s);
for k:= to l do
begin
if trie[j,s[k]]= then
begin
inc(t);
trie[j,s[k]]:=t;
end;
j:=trie[j,s[k]];
end;
can[j]:=true;
end;
ac;
fillchar(dp,sizeof(dp),);
ans:=(calc(,,,)-+mo) mod mo;
writeln(ans);
end.
bzoj3530的更多相关文章
- 【BZOJ3530】数数(AC自动机,动态规划)
[BZOJ3530]数数(AC自动机,动态规划) 题面 BZOJ 题解 很套路的\(AC\)自动机+\(DP\) 首先,如果长度小于\(N\) 就不存在任何限制 直接大力\(DP\) 然后强制限制不能 ...
- [bzoj3530][Sdoi2014]数数_AC自动机_数位dp
数数 bzoj-3530 Sdoi-2014 题目大意:给你一个整数集合,求所有不超过n的正整数,是的它的十进制表示下不能再一段等于集合中的任意数. 注释:$1\le n \le 1200$,$1\l ...
- BZOJ3530: [Sdoi2014]数数
3530: [Sdoi2014]数数 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 322 Solved: 188[Submit][Status] ...
- BZOJ3530[Sdoi2014]数数——AC自动机+数位DP
题目描述 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3223不是幸运 ...
- BZOJ3530:[SDOI2014]数数(AC自动机,数位DP)
Description 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3 ...
- BZOJ3530:[SDOI2014]数数——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3530 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子 ...
- 【bzoj3530】[Sdoi2014]数数 AC自动机+数位dp
题目描述 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3223不是幸运 ...
- BZOJ3530: [Sdoi2014]数数(Trie图,数位Dp)
Description 我们称一个正整数N是幸运数,当且仅当它的十进制表示中不包含数字串集合S中任意一个元素作为其子串.例如当S=(22,333,0233)时,233是幸运数,2333.20233.3 ...
- 数位DP复习小结
转载请注明原文地址http://www.cnblogs.com/LadyLex/p/8490222.html 之前学数位dp的时候底子没打扎实 虚的要死 这次正好有时间……刷了刷之前没做的题目 感觉自 ...
随机推荐
- Java分布式处理技术(RMI,JDNI)
http://hedaoyuan.blog.51cto.com/4639772/813702 1.1 RMI的基本概念 1.1.1 什么是RMI RMI(Remote Method Invocatio ...
- cognos10.2.2使用ODBC连接oracle92数据库(BMT-IMP-0016)
对于Cognos Server 64位Windows系统,注意!请下载32位程序.即: 因为Cognos只认32位ODBC程序.这里千万要注意.对于64位的Windows系统的ODBC有两个程序, ...
- javascript dom 编程艺术笔记 第四章:图片库
首先先建立一个html文件,建立一个图片库 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...
- 还在在专业的blog记录生活吧!
本来觉得自己写文章水平很烂,技术贴也不能保证分析清晰透彻,就决定在百度hi上记录生活随笔.的. 但是,在百度,随便写点啥,都要审核.申诉. 还是在博客园安家吧. 从新手做起.
- Oracle的安装
本人所使用的数据库平台为Oracle 11g 1.下载Oracle Oracle官网即可下载Oracle平台.不过网上资源丰富,大家也可在百度云网盘找到合适的版本. 附上本人网盘里存储的各个Oracl ...
- C++类继承内存布局(三)
参考:http://blog.csdn.net/jiangyi711/article/details/4890889# (三)成员函数 类X中每一个非静态成员函数都会接受一个特殊的隐藏参数——this ...
- [zz]安装Ubuntu 15.10后要做的事
很有用,收藏 http://blog.csdn.net/skykingf/article/details/45267517
- Entity SQL 初入
Entity SQL 是 ADO.NET 实体框架 提供的 SQL 类语言,用于支持 实体数据模型 (EDM).Entity SQL 可用于对象查询和使用 EntityClient 提供程序执行的查询 ...
- 【实习记】2014-09-24万事达卡bin查询项目总结
8月28号,接到这个问题:现有前缀查询速度较慢,改进此知值求区间问题. 一开始没想到用二分法,更没有想到这个项目用了一个月,这一个月里,我学习并使用了middle框架写出了server ...
- Python:如何得到Popen的输出?
from:http://www.cnblogs.com/bluescorpio/archive/2010/05/04/1727020.html 最近在用subprocess中的Popen做个磁盘监控小 ...