数数 bzoj-3530 Sdoi-2014

题目大意:给你一个整数集合,求所有不超过n的正整数,是的它的十进制表示下不能再一段等于集合中的任意数。

注释:$1\le n \le 1200$,$1\le |S|\le 100$,$1\le L\le 1500$,L是总长度之和。

想法:咳咳,显然,我们... ...什么都不想,看着能开下先把AC自动机扔出来

然后,其实数位dp就可以了

具体看代码

最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define mod 1000000007
using namespace std;
typedef long long ll;
struct tree
{
int fail;
int vis[11];
int end;
}a[1600];
char s[1600],t[1250];
int n,m,cnt;
ll f[3][1250][1600],ans;
void build(char *s)
{
int l=strlen(s);
int now=0;
for(int i=0;i<l;i++)
{
int x=s[i]-'0';
if(!a[now].vis[x])
{
a[now].vis[x]=++cnt;
}
now=a[now].vis[x];
}
a[now].end|=1;
}
queue<int>q;
void getfail()
{
while(!q.empty()) q.pop();
for(int i=0;i<10;i++)
{
if(a[0].vis[i]!=0)
{
a[a[0].vis[i]].fail=0;
q.push(a[0].vis[i]);
}
}
while(!q.empty())
{
int now=q.front();q.pop();
for(int i=0;i<10;i++)
{
if(!a[now].vis[i])
{
a[now].vis[i]=a[a[now].fail].vis[i];
}
else
{
a[a[now].vis[i]].fail=a[a[now].fail].vis[i];
a[a[now].vis[i]].end|=a[a[a[now].fail].vis[i]].end;
q.push(a[now].vis[i]);
}
}
}
}
int main()
{
scanf("%s",t+1);
m=strlen(t+1);
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%s",s),build(s);
getfail();
for(int i=0;i<m;i++)
{
for(int j=0;j<=cnt;j++)
{
if(!j)
{
if(!i)
{
int x=t[i+1]-'0';
for(int k=1;k<x;k++)
{
if(!a[a[j].vis[k]].end)
{
f[1][i+1][a[j].vis[k]]+=1;
f[1][i+1][a[j].vis[k]]%=mod;
}
}
if(!a[a[j].vis[x]].end)
{
f[0][i+1][a[j].vis[x]]+=1;
f[0][i+1][a[j].vis[x]]%=mod;
}
}
else
{
for(int k=1;k<=9;k++)
{
if(!a[a[j].vis[k]].end)
{
f[1][i+1][a[j].vis[k]]++;
f[1][i+1][a[j].vis[k]]%=mod;
}
}
}
}
if(f[0][i][j])
{
int x=t[i+1]-'0';
for(int k=0;k<x;k++)
{
if(!a[a[j].vis[k]].end)
{
f[1][i+1][a[j].vis[k]]+=f[0][i][j];
f[1][i+1][a[j].vis[k]]%=mod;
}
}
if(!a[a[j].vis[x]].end)
{
f[0][i+1][a[j].vis[x]]+=f[0][i][j];
f[0][i+1][a[j].vis[x]]%=mod;
}
}
if(f[1][i][j])
{
for(int k=0;k<=9;k++)
{
if(!a[a[j].vis[k]].end)
{
f[1][i+1][a[j].vis[k]]+=f[1][i][j];
f[1][i+1][a[j].vis[k]]%=mod;
}
}
}
}
}
for(int i=0;i<=cnt;i++)
{
ans+=f[0][m][i];
ans%=mod;
ans+=f[1][m][i];
ans%=mod;
}
printf("%lld\n",ans);
return 0;
}

小结:我们在处理字符串问题的时候脑子里先有几个数据结构在搞事情.. ...

[bzoj3530][Sdoi2014]数数_AC自动机_数位dp的更多相关文章

  1. BZOJ_1662_[Usaco2006 Nov]Round Numbers 圆环数_数位DP

    BZOJ_1662_[Usaco2006 Nov]Round Numbers 圆环数_数位DP Description 正如你所知,奶牛们没有手指以至于不能玩“石头剪刀布”来任意地决定例如谁先挤奶的顺 ...

  2. BZOJ_1026_[SCOI2009]windy数_数位DP

    BZOJ_1026_[SCOI2009]windy数_数位DP 题意:windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之 ...

  3. BZOJ_1833_[ZJOI2010]count 数字计数_数位DP

    BZOJ_1833_[ZJOI2010]count 数字计数_数位DP 题意: 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 分析: 数位DP f[i][ ...

  4. [bzoj1026][SCOI2009]windy数_数位dp

    windy数 bzoj-1026 题目大意:求一段区间中的windy数个数. 注释:如果一个数任意相邻两位的差的绝对值都不小于2,这个数就是windy数,没有前导0.$区间边界<=2\cdot ...

  5. [bzoj3209]花神的数论题_数位dp

    花神的数论题 bzoj-3209 题目大意:sum(i)表示i的二进制表示中1的个数,求$\prod\limits_{i=1}^n sum(i)$ 注释:$1\le n\le 10^{15}$. 想法 ...

  6. bzoj1026: [SCOI2009]windy数(传说你是数位DP)

    1026: [SCOI2009]windy数 题目:传送门 题解: 其实之前年少无知的时候好像A过...表示当时并不知道什么数位DP 今天回来深造一发... 其实如果对这个算法稍有了解...看到这题的 ...

  7. bzoj 3209 花神的数论题——二进制下的数位dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3209 可以枚举 “1的个数是...的数有多少个” ,然后就是用组合数算在多少位里选几个1. ...

  8. ZOJ 3494 (AC自动机+高精度数位DP)

    题目链接:  http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3494 题目大意:给定一些被禁止的BCD码.问指定范围内不含有 ...

  9. uva11038_How Many O's?_数位DP

    问m-n之间的数中共有多少个0,过程稍稍麻烦了一些,半天的时间才搞定. 直接上码吧 /********************************************************* ...

随机推荐

  1. Java获取路径中的文件名(正则表达式)

    Java获取路径中的文件名(正则表达式) 目标 在这个路径中我想得到model2 /E:/2017-02-21--SoftWare/github/test/Java/poiDemo_word2exce ...

  2. tarjan用法——割点

    今天洛谷疯狂给我推送tarjan的题(它好像发现了我最近学tarjan),我正好做一做试一试(顺便练一练快读和宏定义). 其实找割点的tarjan和算强连通分量的tarjan不一样,找割点的判定条件比 ...

  3. 简述RTMPDump与编译移植

    RTMPDump主页 ,RTMPDump库主要包含三部分: 1.一个基本的客户端程序 2.两个服务器程序(rtmpsrv.rtmpsuck) 3.一个支持rtmp协议的库—librtmp 下载RTMP ...

  4. Spring Boot 打 war 包的步骤

    ## Spring Boot 打 war 包的步骤 1. 添加 spring-boot-start-tomcat 的 provided 依赖 ``` <dependency> <gr ...

  5. php函数 array_values()

    array_values() 函数返回一个包含给定数组中所有键值的数组,但不保留键名. 提示:被返回的数组将使用数值键,从 0 开始并以 1 递增. $a=array("Name" ...

  6. jQuery考试之错题分析

    获取元素范围大小顺序依次为: $(#one).siblings("div")>$("#one~div")>$("#one +div&quo ...

  7. RabbitMQ 官方NET教程(四)【路由选择】

    在上一个教程中,我们构建了一个简单的日志记录系统. 我们能够广播日志消息给所有你的接收者. 在本教程中,我们将为其添加一个功能 - 我们将让日志接收者可以仅订阅一部分消息. 例如,我们将能够仅将关键的 ...

  8. 文件的上传(可以上传照片,word文档,等单个文件)

    jsp: jsp页面: <LINK href="${basePath}plugins/uploadify/uploadify.css" type="text/css ...

  9. 5.14JDBC

    一.##JDBC 1. 概念:Java DataBase Connectivity  Java 数据库连接, Java语言操作数据库. JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数 ...

  10. Django模板常用语法规则

    Django 模板标签 if/else 标签 for 标签 ifequal/ifnotequal 标签 注释标签 过滤器 include 标签 URL标签 模板继承   if/else 标签 1. 基 ...