正解:AC自动机+dp

解题报告:

传送门!

首先看到多串匹配balabala显然想到建个AC自动机?

然后可以用一点儿数位dp的思想地想下(,,,其实并不算QAQ

幸运数可以分为两类:位数<n的和位数=n的

下面分别考虑下

对位数<n的,相当于就没有任何约束,直接dp转移下就好

然后对位数=n的,另外做一次dp,然后多设一组状态表示当前是否相等(就和数位dp差不多的那种,,,

最后加起来就欧克!

啊说得好潦草,,,算了反正就大概这个意思,看下代码趴QwQ

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define ll long long
#define int long long
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i) const int N=+,mod=1e9+;
int m,nod_cnt,lth,g[N][N],f[N][N][];
ll as;
struct nod{int to[],fail;bool flg;}tr[N];
char str[N],n[N];
queue<int>Q; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:x;
}
il void insert(char *s)
{
ri lth=strlen(s+),nw=;
rp(i,,lth)
{
if(!tr[nw].to[s[i]^''])tr[nw].to[s[i]^'']=++nod_cnt;
nw=tr[nw].to[s[i]^''];
}
tr[nw].flg=;
}
il void bfs()
{
rp(i,,)if(tr[].to[i])Q.push(tr[].to[i]);
while(!Q.empty())
{
ri nw=Q.front();Q.pop();tr[nw].flg|=tr[tr[nw].fail].flg;
rp(i,,)
if(tr[nw].to[i])Q.push(tr[nw].to[i]),tr[tr[nw].to[i]].fail=tr[tr[nw].fail].to[i];
else tr[nw].to[i]=tr[tr[nw].fail].to[i];
}
} main()
{
// freopen("3311.in","r",stdin);freopen("3311.out","w",stdout);
scanf("%s",n+);lth=strlen(n+);
m=read();while(m--){scanf("%s",str+);insert(str);}bfs();
g[][]=f[][][]=;
rp(i,,lth-)
{
rp(j,,nod_cnt)
if(!tr[j].flg)
rp(k,,)
if(!tr[tr[j].to[k]].flg)
{
if(!i && !k)continue;
g[i+][tr[j].to[k]]=(g[i+][tr[j].to[k]]+g[i][j])%mod;
}
}
rp(i,,lth-)rp(j,,nod_cnt)as=(as+g[i][j])%mod;
rp(i,,lth-)
{
rp(j,,nod_cnt)
{
if(!tr[j].flg)
rp(k,,)
if(!tr[tr[j].to[k]].flg)
{
if(!i && !k)continue;
f[i+][tr[j].to[k]][]=(f[i+][tr[j].to[k]][]+f[i][j][])%mod;
if(k<(n[i+]^''))f[i+][tr[j].to[k]][]=(f[i+][tr[j].to[k]][]+f[i][j][])%mod;
if(k==(n[i+]^''))f[i+][tr[j].to[k]][]=(f[i+][tr[j].to[k]][]+f[i][j][])%mod;
}
}
}
rp(i,,nod_cnt)as=(as+f[lth][i][])%mod,as=(as+f[lth][i][])%mod;
printf("%lld\n",as);
return ;
}

最后说下这题的代码实现的时候的小细节,,,

其实都挺普通的只是我没注意到所以给自己强调下QAQ

第一个是在bfs做fail的时候有一句"tr[nw].flg|=tr[tr[nw].fail].flg;"

虽然数据太水不加也能A但不加显然是WA的,,,

放个hack数据趴,1234 2 121 2,如果不加的答案是930,正解是890

第二个是在位数=n的位数的时候,判相等记得是"(n[i+1]^'0'",就,记得+1这个操作鸭,,,

没辣!overr!

tr[nw].flg|=tr[tr[nw].fail].flg;

洛谷P3311 [SDOI2014]数数 AC自动机+dp的更多相关文章

  1. 洛谷P4052 [JSOI2007]文本生成器 AC自动机+dp

    正解:AC自动机+dp 解题报告: 传送门! 感觉AC自动机套dp的题还挺套路的,,, 一般就先跑遍AC自动机,然后就用dp dp的状态一般都是f[i][j]:有i个字符,是ac自动机上的第j个节点, ...

  2. [BZOJ 3530] [Sdoi2014] 数数 【AC自动机+DP】

    题目链接:BZOJ - 3530 题目分析 明显是 AC自动机+DP,外加数位统计. WZY 神犇出的良心省选题,然而去年我太弱..比现在还要弱得多.. 其实现在做这道题,我自己也没想出完整解法.. ...

  3. 洛谷P2444 [POI2000]病毒(AC自动机,DFS求环)

    洛谷题目传送门 AC自动机入门--yyb巨佬的博客 AC自动机入手经典好题(虽然年代久远) 有了fail指针,trie树就不是原来的树型结构了,我们可以把它叫做trie图,由父节点向子节点连的边和fa ...

  4. 洛谷P3796 【模板】AC自动机(加强版)(AC自动机)

    洛谷题目传送门 先膜一发yyb巨佬 orz 想学ac自动机的话,推荐一下yyb巨佬的博客,本蒟蒻也是从那里开始学的. 思路分析 裸的AC自动机,这里就不讲了.主要是这题太卡时了,尽管时限放的很大了.. ...

  5. 洛谷 P3808 【模板】AC自动机(简单版) 题解

    原题链接 前置知识: 字典树.(会 \(\texttt{KMP}\) 就更好) 显然呢,本题用 字典树 和 \(\texttt{KMP}\) 无法解决问题. 所以我们发明了一个东西: \(\textt ...

  6. 洛谷P3796 - 【模板】AC自动机(加强版)

    原题链接 Description 模板题啦~ Code //[模板]AC自动机(加强版) #include <cstdio> #include <cstring> int co ...

  7. 洛谷P3808 【模板】AC自动机(简单版)

    题目背景 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 管理员提示:本题数据内有重复的单词,且重复单词应该计算多次, ...

  8. 【刷题】洛谷 P3808 【模板】AC自动机(简单版)

    题目背景 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 管理员提示:本题数据内有重复的单词,且重复单词应该计算多次, ...

  9. UVALive-4670 Dominating Patterns / 洛谷 3796 【模板】AC自动机

    https://vjudge.net/problem/UVALive-4670 中文题面:https://www.luogu.org/problem/show?pid=3796 AC自动机模板 注意如 ...

随机推荐

  1. 【Unity笔记】打包安卓APK时Build Setting中的三种Build System

    Internal(Default):Unity内置,仅需Android SDK支持.不能导出工程,适用于仅适用Unity开发的工程. Gradle(New):使用Gradle进行构建,需要Androi ...

  2. Python fcntl 与 signal 模块使用

    这两个模块是Python标准库里面就包含的模块 用法介绍在 https://docs.python.org/2/library/signal.html https://docs.python.org/ ...

  3. c++ 一个h文件里面定义一个主类,然后定义多个子类

    最近遇到一个函数,在调用的时候出现问题,记录下实现过程. #ifndef MLS_DEFORMATION_H #define MLS_DEFORMATION_H #include <vector ...

  4. RTMP之后,SRT与QUIC

    RTMP协议存在累计延迟与加密方面的问题,为适应互联网视频低延时,高质量的要求,以UDP为核心,具有创造性的SRT,QUIC等流媒体视频方式将成为新的选择 RTMP协议最初是由Macromedia为通 ...

  5. 【转】WPF自定义控件与样式(6)-ScrollViewer与ListBox自定义样式

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等. 本文主要内容: ScrollViewer的样式拆解及基本样式定义: ListBox集合 ...

  6. linux下Ftp服务安装

    安装vsftp 使用yum命令安装vsftp #yum install vsftpd -y 如果yum安装不成功,可以到 http://pkgs.org/centos-6/centos-x86_64/ ...

  7. asp.net Identity 设置自定义登录

    添加Startup.Auth.cs public partial class Startup { // For more information on configuring authenticati ...

  8. [Stats385] Lecture 05: Avoid the curse of dimensionality

    Lecturer 咖中咖 Tomaso A. Poggio Lecture slice Lecture video 三个基本问题: Approximation Theory: When and why ...

  9. Puppet主机、模块、类、资源、变量、参数、标签命名规范

    Puppet命名规范: 约定说明: 小写字母:"a-z" 大写字母:"A-Z" 数字: "0-9" 句号: "." 下划 ...

  10. 10.20stark组件已经完工

    2018-10-20 19:37:31 stark组件已经做完!基本上和Django的admin一样! 放上github连接:https://github.com/TrueNewBee/pythonD ...