博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[JSOI2007]文本生成器
阅读量:6767 次
发布时间:2019-06-26

本文共 1097 字,大约阅读时间需要 3 分钟。

题目大意:给定一个字符串长度与一个字符串集,求存在该集合中元素作为子串的该长度字串数量

思路:AC自动机+DP+容斥(全集-不合法的)

#include"cstdio"#include"cstring"#include"iostream"#include"algorithm"using namespace std;const int MAXN=65;const int MAXM=105;const int siz=26;const int MOD=1e4+7;int n,m,cnt,ans;int q[MAXN*MAXM];int f[MAXM][MAXN*MAXM];char ch[MAXM];struct Trie{    int vis,fail;    int sn[siz];}T[MAXN*MAXM];void ins(char *ch){    int ln=strlen(ch+1),nw=0;    for(int i=1;i<=ln;++i){        if(!T[nw].sn[ch[i]-'A']) T[nw].sn[ch[i]-'A']=++cnt;        nw=T[nw].sn[ch[i]-'A'];    }T[nw].vis=1;    return;}void Getfail(){    int hd=1,tl=0;    for(int i=0;i
=MOD) f[i+1][T[j].sn[k]]-=MOD; } } } }for(int i=0;i<=cnt;++i) ans=(ans+f[m][i])%MOD; return;}int Fpw(int a,int b){ int x=1; while(b){ if(b&1) x=x*a%MOD; b>>=1;a=a*a%MOD; }return x;}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) scanf("%s",ch+1),ins(ch); Getfail();f[0][0]=1; DP();ans=(Fpw(26,m)-ans+MOD)%MOD; printf("%d\n",ans); return 0;}

转载于:https://www.cnblogs.com/AH2002/p/10020808.html

你可能感兴趣的文章
My Brother Rabbit 游戏攻略,mybrotherrabbit豆子怎么获取?
查看>>
小白成长之路4
查看>>
我的友情链接
查看>>
掌握python机器学习-读书笔记2 (导入数据 && 数据描述)
查看>>
Centos7 mount/ rpm/ yum 软件仓库搭建
查看>>
Linux 系统 文件目录简介
查看>>
EC2上源安装vnstat
查看>>
正则表达式详解
查看>>
如何将网络迁移到云中
查看>>
高性能Web服务之varnish应用详解及实战应用
查看>>
我的友情链接
查看>>
6月第2周网络安全报告:高危漏洞数量增加1.4倍
查看>>
java.io.FileNotFoundException的解决方法
查看>>
Docker容器管理--CentOS7安装docker
查看>>
理解Android Fragmentation问题
查看>>
Linux常用命令收集
查看>>
VIM的使用方法
查看>>
linux邮件系统的优势和便利性
查看>>
华为交换机通用配置方式方法
查看>>
【产品场景】弹性裸金属服务器服务于市场的技术概要分析
查看>>