P4052 [JSOI2007]文本生成器

AC自动机+dp

优秀题解传送门

设f[ i ][ j ]表示串的长度为 i ,当前在 j 点时不可识别的串的方案数

最后用总方案数减去不可识别方案数就是答案了

因为题解写的很好所以我就只在代码中加点注释了(逃

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int mod=;
struct data{
int nxt[],fail,end;
}a[];
int n,m,cnt,ans=,f[][];
char q[];
inline void Trie_build(){
scanf("%s",q);
int u=,len=strlen(q);
for(int i=;i<len;++i){
int p=q[i]-'A';
if(!a[u].nxt[p]) a[u].nxt[p]=++cnt;
u=a[u].nxt[p];
}++a[u].end;
}
inline void AC_build(){
queue <int> h;
for(int i=;i<;++i) if(a[].nxt[i]) h.push(a[].nxt[i]);
while(!h.empty()){
int x=h.front(); h.pop();
for(int i=;i<;++i){
int &to=a[x].nxt[i];
if(to){
a[to].fail=a[a[x].fail].nxt[i];
a[to].end|=a[a[to].fail].end; //如果该串的后缀是可识别的那么这个串也一定是可识别的
h.push(to);
}else to=a[a[x].fail].nxt[i];
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i) Trie_build();
AC_build();
f[][]=;
for(int i=;i<=m;++i)
for(int j=;j<=cnt;++j)
for(int k=;k<;++k)
if(!a[a[j].nxt[k]].end) //不可识别
f[i][a[j].nxt[k]]=(f[i][a[j].nxt[k]]+f[i-][j])%mod;
for(int i=;i<=m;++i) ans=ans*%mod;
for(int i=;i<=cnt;++i) ans=(ans-f[m][i]+mod)%mod; //总方案数-不可识别方案数
printf("%d",ans);
return ;
}

最新文章

  1. js正则实现二代身份证号码验证详解
  2. 分享22款响应式的 jQuery 图片滑块插件
  3. mysql出现“SELECT list is not in GROUP BY clause and contains nonaggregated column [duplicate]”错误提示
  4. Study Emgu VoteForUniqueness
  5. Javascript 图片延迟加载之理论基础
  6. 网易云课堂_C语言程序设计进阶_第一周:数据类型:整数类型、浮点类型、枚举类型_1计算分数精确值
  7. d3.js入门1:安装配置
  8. CODEFORCES 125E MST Company 巧用Kruskal算法
  9. Java ORM Hibernate 入门笔记
  10. pip 升级 pip
  11. 西安理工大学 李爱民 Xi&#39;an University of Technology, Aimin Li
  12. asp.net core 使用docker默认端口修改
  13. Eclipse/myEclipse 代码提示/自动提示/自动完成设置
  14. SJW-遍历我的账户左侧导航页面(句柄切换)
  15. Merkle Tree 概念
  16. Android学习笔记——从源码看Handler的处理机制
  17. #define barrier() __asm__ __volatile__(&quot;&quot;: : :&quot;memory&quot;) 中的memory是gcc的东西
  18. STM32F429I-DISCO 和GPS的亲热接触
  19. Docker 版本升级
  20. CentOS7.2 安装RabbitMQ3.6.10

热门文章

  1. iptables、防火墙配置、NAT端口映射
  2. empty对如下8种情况返回true
  3. 判断一个正整数是否是2的N次方的简洁算法及其证明
  4. TensorFlow 实现分类操作的函数学习
  5. Oracle HA 之 Server Pool 实战
  6. linux:查看以及管理进程
  7. OC中分类(Category)和扩展(Extension)
  8. 数字货币量化教程——使用itertools实现各种排列组合
  9. sublime 使用总结
  10. [解决]WPF 在 win7 系统无法运行:FileNotFoundException