【BZOJ1030】文本生成器(容斥原理,AC自动机,计数DP)
2024-09-02 06:49:21
题意:给出n个字符串,求长为m至少包含n个里其中一个的串的字符串一共有多少个,字符集为A到Z,答案对10007取模
n<=60,len<=100
思路:将至少一个转化为所有个数减去没有出现的个数
dp[i][j]表示长度为i,当前在AC自动机上j号节点的方案数
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef vector<int> VI;
#define fi first
#define se second
#define MP make_pair
#define N 110
#define M 7010
#define eps 1e-8
#define pi acos(-1)
#define oo 1e9
#define MOD 10007 int dp[N][M],nxt[M][],c[M],fa[M],q[M*],cnt,n,m,len;
char b[M]; void build()
{
int u=;
for(int i=;i<=len;i++)
{
int t=b[i]-'A'+;
if(!nxt[u][t]) nxt[u][t]=++cnt;
u=nxt[u][t];
}
c[u]=;
} void acauto()
{
int t=; int w=; q[]=;
while(t<w)
{
int u=q[++t];
for(int i=;i<=;i++)
{
if(nxt[u][i])
{
int son=nxt[u][i];
int p=fa[u];
if(u==) fa[son]=;
else fa[son]=nxt[p][i];
q[++w]=son;
}
else
{
int p=fa[u];
if(u==) nxt[u][i]=;
else nxt[u][i]=nxt[p][i];
}
}
if(c[fa[u]]) c[u]=;
}
} void update(int &x)
{
if(x>=MOD) x-=MOD;
} int main()
{
//freopen("bzoj1030.in","r",stdin);
//freopen("bzoj1030.out","w",stdout); scanf("%d%d",&n,&m);
cnt=;
memset(c,,sizeof(c));
for(int i=;i<=n;i++) {scanf("%s",b+); len=strlen(b+); build();}
acauto();
//printf("%d\n",cnt);
dp[][]=;
for(int i=;i<=m;i++)
{
for(int j=;j<=cnt;j++)
if(!c[j])
{
for(int k=;k<=;k++)
{
int t=nxt[j][k];
dp[i][t]=(dp[i][t]+dp[i-][j])%MOD;
}
}
}
ll ans=;
for(int i=;i<=m;i++) ans=ans*%MOD;
for(int i=;i<=cnt;i++)
if(!c[i])
{
ans-=dp[m][i];
ans=(ans%MOD+MOD)%MOD;
}
printf("%lld\n",ans);
return ;
}
最新文章
- css通用小笔记01——导航背景
- 【bzoj3160】万径人踪灭 FFT
- MVC知识点02
- EntityFramework left join
- JSP基础学习(一)
- ABP之动态WebAPI
- 分布式搜索ElasticSearch构建集群与简单搜索实例应用
- map中结构体做关键字的注意事项
- 从0到1搭建spark集群---企业集群搭建
- 操作系统:修改VirtualBox for Mac的虚拟硬盘大小
- Python xlrd xlwt 读取写入Excel.
- Perl语法的基本规则
- 基于 Django的Ajax实现 文件上传
- tomcat接口调用时延开关
- AOJ 2200 Mr. Rito Post Office (floyd+DP)
- js同时获得数组的两个最小值
- 20145232 韩文浩 《Java程序设计》第1周学习总结
- 从零开始学Kotlin-使用接口(7)
- Real-Time Rendering.3rd,Radiance与距离无关 的解释
- 第一百四十五节,JavaScript,同步动画
热门文章
- BZOJ2023: [Usaco2005 Nov]Ant Counting 数蚂蚁(dp)
- nginx反向代理后端web服务器记录客户端ip地址
- 基于 Generator 和 Iterator 的惰性列表
- 关于PHPExcel导出Excel时身份证,数字会导出为科学计数的处理方法
- 【104】Maven3.5.0结合eclipse使用,提示Lambda expressions are allowed only at source level 1.8 or above错误的解决方法
- 在windows和Linux下安装nodejs
- 二叉树的镜像(Python实现)
- activity切换交互动画
- TCP/IP网络编程之地址族与数据序列
- java多线程安全的问题