题意:给出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 ;
}

最新文章

  1. css通用小笔记01——导航背景
  2. 【bzoj3160】万径人踪灭 FFT
  3. MVC知识点02
  4. EntityFramework left join
  5. JSP基础学习(一)
  6. ABP之动态WebAPI
  7. 分布式搜索ElasticSearch构建集群与简单搜索实例应用
  8. map中结构体做关键字的注意事项
  9. 从0到1搭建spark集群---企业集群搭建
  10. 操作系统:修改VirtualBox for Mac的虚拟硬盘大小
  11. Python xlrd xlwt 读取写入Excel.
  12. Perl语法的基本规则
  13. 基于 Django的Ajax实现 文件上传
  14. tomcat接口调用时延开关
  15. AOJ 2200 Mr. Rito Post Office (floyd+DP)
  16. js同时获得数组的两个最小值
  17. 20145232 韩文浩 《Java程序设计》第1周学习总结
  18. 从零开始学Kotlin-使用接口(7)
  19. Real-Time Rendering.3rd,Radiance与距离无关 的解释
  20. 第一百四十五节,JavaScript,同步动画

热门文章

  1. BZOJ2023: [Usaco2005 Nov]Ant Counting 数蚂蚁(dp)
  2. nginx反向代理后端web服务器记录客户端ip地址
  3. 基于 Generator 和 Iterator 的惰性列表
  4. 关于PHPExcel导出Excel时身份证,数字会导出为科学计数的处理方法
  5. 【104】Maven3.5.0结合eclipse使用,提示Lambda expressions are allowed only at source level 1.8 or above错误的解决方法
  6. 在windows和Linux下安装nodejs
  7. 二叉树的镜像(Python实现)
  8. activity切换交互动画
  9. TCP/IP网络编程之地址族与数据序列
  10. java多线程安全的问题