LGP3311题解
为什么我和同学对比了一下,发现我和他的做法差别很大啊
对于这种问题,我们把整个字符串分为两个部分:前缀顶着最高位和后缀没有顶着最高位。
我们枚举这个前缀,然后后缀通过 DP 来搞定。
不包含任何一个子串,似乎最有力的处理工具就是 ACAM。
于是我们可以确定这个 DP 的状态:\(dp[k][u]\) 表示从自动机的节点 \(u\) 上走 \(k\) 条边都遇不上被标记点的方案数。
转移:\(dp[k][u]\) 从 \(dp[k-1][trans[u][c]]\) 转移过来就好了。
但是这样会有一个问题:枚举出来的正整数含有前导 \(0\)。
考虑加上被判断成不合法的方案。我们枚举前导 \(0\) 的数量,然后将正整数分为四类:
//加前导0合法 / 不加前导0合法 - a
//加前导0合法 / 不加前导0不合法 - b=0
//加前导0不合法 / 不加前导0合法 - c
//加前导0不合法 / 不加前导0不合法 - d
可以发现我们原本计算的是 \(a+b\),但是我们需要计算 \(a+c\)。
枚举了前导 \(0\) 后,直接减去 \(a+b\) 然后加上 \(a+c\) 就可以了(
具体的话维护一个节点,每次都往 \(0\) 方向走就行了。
#include<cstring>
#include<cstdio>
#include<cctype>
typedef unsigned ui;
const ui M=1505,mod=1e9+7;
ui n,m,tot(1),dp[M][M],fail[M],trans[M][10];bool vis[M];char s[M],S[M];
inline void Insert(char*s){
ui u(1);
while(isdigit(*s)){
const ui&c=*s-48;*s++=0;
if(!trans[u][c])trans[u][c]=++tot;
u=trans[u][c];
}
vis[u]=true;
}
inline void Build(){
static ui L,R,q[M];L=1;
for(ui c=0;c<10;++c){
if(trans[1][c])q[++R]=trans[1][c],fail[trans[1][c]]=1;
else trans[1][c]=1;
}
while(L<=R){
const ui&u=q[L++];
for(ui c=0;c<10;++c){
if(trans[u][c])q[++R]=trans[u][c],fail[trans[u][c]]=trans[fail[u]][c];
else trans[u][c]=trans[fail[u]][c];
}
}
for(ui i=1;i<=R;++i)vis[q[i]]|=vis[fail[q[i]]];
}
signed main(){
ui ans(0);
scanf("%s%u",s+1,&n);m=strlen(s+1);
for(ui i=1;i<=n;++i){
scanf("%s",S);Insert(S);
}
Build();
for(ui u=1;u<=tot;++u)if(!vis[u])dp[0][u]=1;
for(ui i=1;i<=m;++i){
for(ui u=1;u<=tot;++u)if(!vis[u]){
for(ui c=0;c<10;++c)dp[i][u]=(dp[i][u]+dp[i-1][trans[u][c]])%mod;
}
}
ui u(1),now(1);
for(ui i=1;i<=m;++i){
if(vis[u])break;now=trans[now][0];
for(ui c=0;c<s[i]-48;++c)if(!vis[trans[u][c]])ans=(ans+dp[m-i][trans[u][c]])%mod;
if(i!=m)for(ui c=1;c<10;++c)ans=(ans+mod+dp[m-i-1][trans[1][c]]-dp[m-i-1][trans[now][c]])%mod;
u=trans[u][s[i]-48];
}
if(!vis[u])++ans,ans==mod&&(ans=0);
printf("%u",(ans+mod-1)%mod);
}
LGP3311题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- 入门 - k8s伸缩应用程序 (六)
目标 使用 kubectl 伸缩应用程序. Scaling(伸缩)应用程序 在之前的文章中,我们创建了一个 Deployment,然后通过 服务 提供访问 Pod 的方式.我们发布的 Deployme ...
- C++实现对Json数据的友好处理
背景 C/C++客户端需要接收和发送JSON格式的数据到后端以实现通讯和数据交互.C++没有现成的处理JSON格式数据的接口,直接引用第三方库还是避免不了拆解拼接.考虑到此项目将会有大量JSON数据需 ...
- insert/delete/select/update 以及一些在select中常用的函数之类的
crud程序员:create,read,update.delete 一.insert 细节说明: 1.插入的数据应与字段的数据类型相同.比如把'abc'添加到int类型会错误2.数据的长度应在列的规定 ...
- 剑指Offer系列_30_包含min函数的栈
以空间换时间: package leetcode.sword_to_offfer.day01; import java.util.Stack; /** * 定义栈的数据结构,请在该类型中实现一个能够得 ...
- 《PHP程序员面试笔试宝典》——如何解决求职中的时间冲突问题?
如何巧妙地回答面试官的问题? 本文摘自<PHP程序员面试笔试宝典> 对求职者而言,求职季就是一个赶场季,一天少则几家.十几家企业入校招聘,多则几十家.上百家企业招兵买马.企业多,选择项自然 ...
- Solution -「ABC 213H」Stroll
\(\mathcal{Description}\) Link. 给定一个含 \(n\) 个结点 \(m\) 条边的简单无向图,每条边的边权是一个常数项为 \(0\) 的 \(T\) 次多项式, ...
- 01 MySQL数据库安装(Windows+Mac)
目录 MySQL数据库安装 Windows 1.主要版本简介 2.软件下载 3.文件目录简介 4.使用 4.1配置环境变量 4.2登录 制作MySQL服务端开机自启动 运行MySQL 4.3 密码修改 ...
- windbg调试系列教程:sos扩展的介绍和使用
SOS是什么? 直观来说,sos就是一个程序集文件.这个程序集的作用就是让我们在使用windbg分析.net进程时,更加方便快捷.通过sos,我们可以清晰的查看CLR运行时的各类信息,辅助我们去理解托 ...
- VS Code 在线运行:code-server部署(系列一)
偶然间发现VS Code可以在线运行,闲来无事部署了一套试试效果,先上图,是不是很熟悉的感觉,初步体验基本跟本地运行效果一样. 进入正题 首先要准备一套linux环境,环境配置最低是1G内存.2核CP ...
- Typora的使用教程.md
Typora的使用教程 原创:https://home.cnblogs.com/u/cn-zhouchao 2021.12.13 一.软件的介绍 Typora 是一款由 Abner Lee 开发的轻量 ...