CF 434C Tachibana Kanade's Tofu[数位dp+AC自动机]

- Solution

//本代码压掉后两维
#include<cstdio>
#define max(a,b) (a<b?b:a)
using namespace std;
inline void read(int &x){
register char ch=getchar();x=;
while(ch<''||ch>'') ch=getchar();
while(ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
}
const int N=,M=;
const int mod=1e9+;
int n,m,K,cnt=,a[N],b[N];int bfs[N];
int v[N],fail[N],next[N][],trans[N][];
int f[N][N][M];
inline void insert(int l){
int x,now=;
for(int i=;i<=l;i++){
read(x);
if(!next[now][x]) next[now][x]=++cnt;
now=next[now][x];
}
read(x);v[now]+=x;
}
inline void build_AC(){
int l=,r=,x,y;
for(int i=;i<m;i++){
if(next[][i]){
x=next[][i];
fail[x]=;
trans[][i]=x;
bfs[++r]=x;
}
else{
trans[][i]=;
}
}
while(l!=r){
x=bfs[++l];
v[x]+=v[fail[x]];
for(int i=,p;i<m;i++){
if(next[x][i]){
y=next[x][i];
for(p=fail[x];p&&!next[p][i];p=fail[p]);
if(p) fail[y]=next[p][i];
else fail[y]=;
trans[x][i]=y;
bfs[++r]=y;
}
else{
for(p=fail[x];p&&!next[p][i];p=fail[p]);
if(p) trans[x][i]=next[p][i];
else trans[x][i]=;
}
}
}
}
inline void Plus(int &x,int y){
x+=y;
if(x>=mod) x-=mod;
}
inline void prep(int bit){//无任何限制预处理
for(int i=;i<=cnt;i++) f[][i][]=;
for(int i=;i<=bit;i++){
for(int j=;j<=cnt;j++){
for(int p=,x;p<m;p++){
x=trans[j][p];
for(int k=v[x];k<=K;k++){
Plus(f[i][j][k],f[i-][x][k-v[x]]);
}
}
}
}
}
inline int work(int *a,bool flag){
int x,y,w,ans=;
//取出最高位后,保证无前导零后,无限制
for(int i=;i<a[];i++){
for(int j=;j<m;j++){
y=trans[][j];
w=v[y];
for(int k=w;k<=K;k++){
Plus(ans,f[i-][y][k-w]);
}
}
}
//走一遍上界,要保证无前导零
x=;w=;
for(int i=;i<=a[];i++){
for(int j=(i==);j<a[i];j++){
y=trans[x][j];
for(int k=;k<=K-(w+v[y]);k++){
Plus(ans,f[a[]-i][y][k]);
}
}
x=trans[x][a[i]];
w+=v[x];
}
if(flag){//上界有否取
if(w<=K) Plus(ans,);
}
return ans;
}
int main(){
read(n);read(m);read(K);
read(a[]);for(int i=;i<=a[];i++) read(a[i]);
read(b[]);for(int i=;i<=b[];i++) read(b[i]);
for(int i=,l;i<=n;i++) read(l),insert(l);
build_AC();prep(max(a[],b[]));
printf("%d\n",(work(b,)-work(a,)+mod)%mod);
return ;
}
CF 434C Tachibana Kanade's Tofu[数位dp+AC自动机]的更多相关文章
- 咕咕(数位dp+AC自动机)
咕咕(数位dp+AC自动机) 若一个字符串的字符集合是0~m-1,那么称它为m进制字符串.给出n个m进制字符串\(s_i\),每个字符串的权值为\(v_i\).对于另一个m进制字符串\(S\),设\( ...
- 2019.02.15 codechef Favourite Numbers(二分+数位dp+ac自动机)
传送门 题意: 给444个整数L,R,K,nL,R,K,nL,R,K,n,和nnn个数字串,L,R,K,数字串大小≤1e18,n≤65L,R,K,数字串大小\le1e18,n\le65L,R,K,数字 ...
- [Sdoi2014]数数[数位dp+AC自动机]
3530: [Sdoi2014]数数 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 834 Solved: 434[Submit][Status][ ...
- Codeforces Round #248 (Div. 1) C - Tachibana Kanade's Tofu AC自动机
C - Tachibana Kanade's Tofu 思路:把 n 个串丢进AC自动机中,然后dp就好啦. 我的代码居然是在CF上跑最快的.. #include<bits/stdc++.h&g ...
- 洛谷$P4045\ [JSOI2009]$密码 $dp$+$AC$自动机
正解:$dp$+$AC$自动机+搜索 解题报告: 传送门$QwQ$ 首先显然先建个$AC$自动机,然后考虑设$f_{i,j,k}$表示长度为$i$,现在在$AC$自动机的第$j$个位置,已经表示出来的 ...
- 【hdu3247-Resource Archiver】位压DP+AC自动机+SPFA
题意:给定n个文本串,m个病毒串,文本串重叠部分可以合并,但合并后不能含有病毒串,问所有文本串合并后最短多长. (2 <= n <= 10, 1 <= m <= 1000) 题 ...
- 【HDU3247】 Resource Archiver(DP+AC自动机+最短路)
Resource Archiver Time Limit: 10000MS Memory Limit: 100000KB 64bit IO Format: %I64d & %I64u ...
- POJ 3691 DNA repair (DP+AC自动机)
DNA repair Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4815 Accepted: 2237 Descri ...
- BZOJ 1559 JSOI2009 密码 状压dp+AC自动机+搜索
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1559 分析: 这个题意真的是很**啊!!!直接说每一个字符串至少出现一次不就好了吗... ...
随机推荐
- linux(centos7)防火墙配置firewalld和iptables
linux系统中防火墙管理有2种方式,分别是iptables和firewalld(centos7.x),下面介绍centos7的配置方法 一.firewalld: 因为cenos7默认使用firewa ...
- eclipse 安装图形插件(图形化编程)
打开eclipse 查看什么版本 ,我的是Oxygen help --> install newsoftware 打开地址 http://www.eclipse.org/windowbuilde ...
- 机器学习结果加ID插入数据库源码
import org.apache.spark.mllib.evaluation.BinaryClassificationMetrics import org.apache.spark.mllib.l ...
- 自建Nuger Server拾遗
企业内部的包需要通过nuget来管理发布,或者一些不允许上外网的企业,通过自己的nuget服务器来使用nuget,都会考虑到自建一个nuget服务器.本文整理了一些有用的链接和使用心得,以备不时之需. ...
- Android学习之——ListView下拉刷新
背景知识 ListView使用非常广泛,对于使用ListView的应用来说,下拉刷新是必不可少要实现的功能. 我们常用的微博.网易新闻,搜狐新闻都使用了这一功能,如下图所示. 微博 搜狐新闻 ...
- SSM框架面试题及答案整理
一.Spring面试题 1.Spring 在ssm中起什么作用? Spring:轻量级框架 作用:Bean工厂,用来管理Bean的生命周期和框架集成. 两大核心:①. IOC/DI(控制反转/依赖注入 ...
- sql产生随机数
使用RAND(),结果是类似于这样的随机小数:0.615942003695649 SELECT FLOOR(RAND()*N) ---生成的数是这样的:12.0 SELECT CAST(FLOOR( ...
- 对转换公式为LaTeX代码要注意什么
mathtype是一款专业的数学公式编辑工具,理科生专用的工具.mathtype公式编辑器能够帮助用户在各种文档中插入复杂的数学公式和符号.可以轻松的将数学公式转换成LaTex代码,但是转换LaTeX ...
- VC++ 链接错误LINK : fatal error LNK1104: cannot open file "*.lib"
问题描述: 运行VC++编译时经常出现 Linking… LINK : fatal error LNK1104: cannot open file “*.lib” Error executing li ...
- [转]油猴Tampermonkey-让百度云下载飞起来
1. 简介 Tampermonkey,油猴脚本是一款免费的浏览器扩展程序. 我们这里用于Chrome浏览器,目的是为了让百度云里面的文件以满速下载,VIP还得出钱呢. 2. 安装 安装Lantern蓝 ...