【BZOJ3530】数数(AC自动机,动态规划)
【BZOJ3530】数数(AC自动机,动态规划)
题面
题解
很套路的\(AC\)自动机+\(DP\)
首先,如果长度小于\(N\)
就不存在任何限制
直接大力\(DP\)
然后强制限制不能走到带有标记的点上面
如果长度恰好为\(N\)的长度
那么,要考虑是否恰好卡在范围里面
于是\(DP\)状态多记一维
表示是否卡在范围里面
最后求一下和就行啦
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define MAX 2000
#define MOD 1000000007
struct Node
{
int vis[10];
int lt,fail;
}t[MAX];
int tot,m;
char N[MAX],ch[MAX];
int f[MAX][MAX][2],g[MAX][MAX];
void insert(char *s)
{
scanf("%s",s+1);
int l=strlen(s+1),now=0;
for(int i=1;i<=l;++i)
{
if(!t[now].vis[s[i]-48])
t[now].vis[s[i]-48]=++tot;
now=t[now].vis[s[i]-48];
}
t[now].lt=1;
}
void GetFail()
{
queue<int> Q;
for(int i=0;i<=9;++i)
if(t[0].vis[i])Q.push(t[0].vis[i]);
while(!Q.empty())
{
int u=Q.front();Q.pop();
t[u].lt|=t[t[u].fail].lt;
for(int i=0;i<=9;++i)
if(t[u].vis[i])
t[t[u].vis[i]].fail=t[t[u].fail].vis[i],Q.push(t[u].vis[i]);
else t[u].vis[i]=t[t[u].fail].vis[i];
}
}
int main()
{
scanf("%s",N+1);
scanf("%d",&m);
while(m--)insert(ch);
GetFail();
int l=strlen(N+1);
long long ans=0;
g[0][0]=1;
for(int i=0;i<l;++i)
for(int u=0;u<=tot;++u)
if(!t[u].lt)
{
for(int k=0;k<=9;++k)
if(!t[t[u].vis[k]].lt)
{
if(!i&&!k)continue;
(g[i+1][t[u].vis[k]]+=g[i][u])%=MOD;
}
}
for(int i=1;i<l;++i)
for(int j=0;j<=tot;++j)
ans=(ans+g[i][j])%MOD;
f[0][0][1]=1;
for(int i=0;i<l;++i)
for(int u=0;u<=tot;++u)
if(!t[u].lt)
{
for(int k=0;k<=9;++k)
if(!t[t[u].vis[k]].lt)
{
if(!i&&!k)continue;
(f[i+1][t[u].vis[k]][0]+=f[i][u][0])%=MOD;
if(k<N[i+1]-48)(f[i+1][t[u].vis[k]][0]+=f[i][u][1])%=MOD;
if(k==N[i+1]-48)(f[i+1][t[u].vis[k]][1]+=f[i][u][1])%=MOD;
}
}
for(int i=0;i<=tot;++i)
ans=(ans+f[l][i][0])%MOD,ans=(ans+f[l][i][1])%MOD;
printf("%lld\n",ans);
return 0;
}
【BZOJ3530】数数(AC自动机,动态规划)的更多相关文章
- 【HDU3530】 [Sdoi2014]数数 (AC自动机+数位DP)
3530: [Sdoi2014]数数 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 682 Solved: 364 Description 我们称一 ...
- 【JZOJ3624】【SDOI2014】数数(count) AC自动机+数位dp
题面 100 容易想到使用AC自动机来处理禁忌子串的问题: 然后在自动机上数位dp,具体是: \(f_{i,j,0/1}\)表示填了\(i\)位,当前在自动机的第\(j\)个结点上,\(0\)表示当前 ...
- [BZOJ 3530] [Sdoi2014] 数数 【AC自动机+DP】
题目链接:BZOJ - 3530 题目分析 明显是 AC自动机+DP,外加数位统计. WZY 神犇出的良心省选题,然而去年我太弱..比现在还要弱得多.. 其实现在做这道题,我自己也没想出完整解法.. ...
- BZOJ1030 [JSOI2007]文本生成器 AC自动机 动态规划
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1030 题意概括 给出n个模式串,问长度为m的串中有多少个至少含有这n个模式串中的任意一个. 注意, ...
- 【BZOJ1030】[JSOI2007]文本生成器 AC自动机+动态规划
[BZOJ1030][JSOI2007]文本生成器 Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文 ...
- 【JSOI2007】文本生成器 题解(AC自动机+动态规划)
题目链接 题目大意:给定$n$个子串,要求构造一个长度为$m$的母串使得至少有一个子串是其子串.问方案数. ------------------------ 我们可以对要求进行转化:求出不合法的方案数 ...
- UVA - 11468 (AC自动机+动态规划)
建立AC自动机,把AC自动机当做一张图,在上面跑L个节点就行了. 参考了刘汝佳的代码,发现可能有一个潜在的Bug--如果模式串中出现了没有指定的字符,AC自动机可能会建立出错. 提供一组关于这个BUG ...
- 视频游戏的连击 [USACO12JAN](AC自动机+动态规划)
传送门 默认大家都学过trie与AC自动机. 先求出fail,对于每个节点维护一个sum,sum[u]待表从根到u所形成的字符串能拿到几分.显然sum[u]=sum[fail] + (u是几个字符串的 ...
- BZOJ2553 Beijing2011禁忌(AC自动机+动态规划+矩阵快速幂+概率期望)
考虑对一个串如何分割能取得最大值.那么这是一个经典的线段覆盖问题,显然每次取右端点尽量靠前的串.于是可以把串放在AC自动机上跑,找到一个合法串后就记录并跳到根. 然后考虑dp.设f[i][j]表示前i ...
随机推荐
- alertifyjs
<%@ page contentType="text/html; charset=UTF-8"%> <!DOCTYPE html PUBLIC "-// ...
- 页面刷新方式实时检测cookie是否失效
在浏览器端每隔10秒钟刷新一次页面,可用于检查cookie值是否失效. 在study.php文件中存在这样一条语句: <meta http-equiv="refresh" c ...
- laypage 使用
最近发现一个特别好用的前端分页插件,分享一下 <!doctype html> <html> <head> <meta charset="utf-8& ...
- 用node.js搭建本地服务器
我的第一篇笔记来写写node.js,我对node.js的并不是很了解,基本的项目路径变换还是会的.原先我下载node.js就是我想学vue.js,后来因为工作的繁忙搁浅了我的计划.最近在学习phase ...
- MongoDB 搭建可复制群集
一.概述 MongoDB复制群集支持节点故障自动切换,最小配置应包含3个节点,正常情况下应该至少包含两个数据节点,第三个节点可以是数据节点也可以是仲裁节点.仲裁节点的作用是当出现偶数节点导致无法仲裁的 ...
- tensorflow_mnist数据集一直加载错误的解决办法
tensorflow数据集一直加载错误的解决办法: from tensorflow.examples.tutorials.mnist import input_data mnist = input_d ...
- AJAX跨域完全讲解
AJAX跨域完全讲解 今天在慕课网上学习了AJAX跨域完全讲解:https://www.imooc.com/learn/947 我在收集AJAX面试题的时候其实就已经有过AJAX跨域的问题的了,当时候 ...
- MySQL如何正确查询字段为NULL的字段
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...
- Luogu P2419 [USACO08JAN]牛大赛Cow Contest
题目背景 [Usaco2008 Jan] 题目描述 N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a p ...
- 用Node.JS+MongoDB搭建个人博客(页面模板)(五)(结束)
<差不多先生> 我是差不多先生,我的差不多是天生.也代表我很天真,也代表我是个闲人.这差不多的人生,总是见缝插针. 求学的道路上总是孤独的,即使别人不理解我,认为我是奇葩!但没关系,我会坚 ...