题目大意:给n个单词,长度不超过L的单词有多少个包含n个单词中的至少一个单词。

题目分析:用长度不超过L的单词书目减去长度在L之内所有不包含任何一个单词的书目。

代码如下:

# include<iostream>
# include<cstdio>
# include<queue>
# include<cstring>
# include<algorithm>
using namespace std; # define LL long long
# define ULL unsigned long long struct Matrix
{
int n;
ULL ele[35][35];
Matrix(int _n):n(_n){
for(int i=0;i<n;++i) for(int j=0;j<n;++j)
ele[i][j]=0;
}
};
int ch[35][26];
int fail[35],cnt;
bool word[35]; void init()
{
cnt=0;
memset(ch,-1,sizeof(ch));
memset(word,false,sizeof(word));
} int idx(char c)
{
return c-'a';
} void insert(char *s)
{
int n=strlen(s);
int r=0;
for(int i=0;i<n;++i){
int c=idx(s[i]);
if(ch[r][c]==-1) ch[r][c]=++cnt;
r=ch[r][c];
}
word[r]=true;
} void getFail()
{
queue<int>q;
fail[0]=0;
for(int i=0;i<26;++i){
if(ch[0][i]==-1){
ch[0][i]=0;
}else{
fail[ch[0][i]]=0;
q.push(ch[0][i]);
}
}
while(!q.empty())
{
int u=q.front();
q.pop();
if(word[fail[u]]) word[u]=true;
for(int i=0;i<26;++i){
if(ch[u][i]==-1)
ch[u][i]=ch[fail[u]][i];
else{
fail[ch[u][i]]=ch[fail[u]][i];
q.push(ch[u][i]);
}
}
}
} Matrix getMatrix()
{
Matrix mat(cnt+1);
for(int i=0;i<mat.n;++i)
for(int j=0;j<26;++j) if(!word[ch[i][j]])
++mat.ele[i][ch[i][j]];
++mat.n;
for(int i=0;i<mat.n;++i){
mat.ele[mat.n-1][i]=0;
mat.ele[i][mat.n-1]=1;
}
return mat;
} Matrix mul(Matrix a,Matrix b)
{
Matrix c(a.n);
for(int i=0;i<c.n;++i) for(int j=0;j<c.n;++j)
for(int k=0;k<c.n;++k) c.ele[i][j]+=a.ele[i][k]*b.ele[k][j];
return c;
} Matrix myPow(Matrix a,LL k)
{
Matrix mat(a.n);
for(int i=0;i<mat.n;++i) mat.ele[i][i]=1;
while(k>0){
if(k&1) mat=mul(mat,a);
a=mul(a,a);
k>>=1;
}
return mat;
} ULL getSum(LL x)
{
Matrix mat(2);
mat.ele[0][0]=26;
mat.ele[0][1]=1;
mat.ele[1][0]=0;
mat.ele[1][1]=1;
mat=myPow(mat,x);
return mat.ele[0][1];
} char prefix[8]; int main()
{
int n;
LL L;
while(~scanf("%d%lld",&n,&L))
{
init();
for(int i=0;i<n;++i){
scanf("%s",prefix);
insert(prefix);
}
getFail();
Matrix mat=getMatrix();
mat=myPow(mat,L+1);
ULL ans1=mat.ele[0][mat.n-1];
ULL ans2=getSum(L+1);
cout<<ans2-ans1<<endl;
}
return 0;
}

HDU-2243 考研路茫茫——单词情结(AC自动机)的更多相关文章

  1. hdu 2243 考研路茫茫——单词情结 AC自动机 矩阵幂次求和

    题目链接 题意 给定\(N\)个词根,每个长度不超过\(5\). 问长度不超过\(L(L\lt 2^{31})\),只由小写字母组成的,至少包含一个词根的单词,一共可能有多少个? 思路 状态(AC自动 ...

  2. hdu 2243 考研路茫茫——单词情结 ac自动机+矩阵快速幂

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2243 题意:给定N(1<= N < 6)个长度不超过5的词根,问长度不超过L(L <23 ...

  3. HDU 2243 考研路茫茫——单词情结(AC自动机+DP+快速幂)

    题目链接 错的上头了... 这题是DNA的加强版,26^1 +26^2... - A^1-A^2... 先去学了矩阵的等比数列求和,学的是第二种方法,扩大矩阵的方法.剩下就是各种模板,各种套. #in ...

  4. hdu 2243 考研路茫茫——单词情结(AC自动+矩阵)

    考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. HDU 2243 考研路茫茫——单词情结(AC自动机+矩阵)

    考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. HDU 2243 考研路茫茫——单词情结

    考研路茫茫——单词情结 Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID ...

  7. hdu_2243_考研路茫茫——单词情结(AC自动机+矩阵)

    题目链接:hdu_2243_考研路茫茫——单词情结 题意: 让你求包含这些模式串并且长度不小于L的单词种类 题解: 这题是poj2788的升级版,没做过的强烈建议先做那题. 我们用poj2778的方法 ...

  8. HDU2243 考研路茫茫——单词情结 ——AC自动机、矩阵优化

    题目链接:https://vjudge.net/problem/HDU-2243 考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others)    Memor ...

  9. HDU 2243考研路茫茫——单词情结 (AC自动机+矩阵快速幂)

    背单词,始终是复习英语的重要环节.在荒废了3年大学生涯后,Lele也终于要开始背单词了. 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法.比如"ab",放在单词前一般 ...

  10. HDU 2243 考研路茫茫――单词情结 ——(AC自动机+矩阵快速幂)

    和前几天做的AC自动机类似. 思路简单但是代码200余行.. 假设solve_sub(i)表示长度为i的不含危险单词的总数. 最终答案为用总数(26^1+26^2+...+26^n)减去(solve_ ...

随机推荐

  1. 利用netperf、iperf、mtr测试网络

    1.netperf安装和使用 netperf安装 # tar -xzvf netperf-.tar.gz # cd netperf- # ./configure # make # make insta ...

  2. centos7安装jdk8

    1.查看是否已经安装了jdk rpm -qa|grep java 表示没有安装jre 如果已经安装请先卸载 2.查看可安装的java环境 yum list java* 3.安装 java-1.8.0- ...

  3. 添加网络打印机的步骤(xp和win2008)

    1.如题,设置好打印机去的ip地址和子网掩码等信息. 2 .xp不像其他新的系统那么好用那么智能...只能慢慢来 如果是xp,注意,请添加网络打印机的时候选  :添加本地打印机,,记得哦 然后如图 然 ...

  4. SWFUpload - JQuery上传插件

    首先,大家可以去SWF的官网下载相关Demo或者源码. 官方地址:http://code.google.com/p/swfupload/ 官方Demo:http://demo.swfupload.or ...

  5. 自己动手做logo

    本文主要记录用 coreDraw 和ps 做公司logo . 我修改的logo.效果还不错. 1 矢量图 和位图的区别 http://jingyan.baidu.com/article/54b6b9c ...

  6. C语言程序设计第十次作业

    一.实验内容        1.有5名学生,每名学生有语文.数学和外语3门课的考试成绩.编程统计各学生的总分和平均分以及所有学生各科的平均分.要求成绩在程序中初始化,结果以表格的形式输出.      ...

  7. c# txt文件的读写

    在公司实习,任务不太重,总结一下c#关于txt文件的读写,以便以后有用到的时候可以查看一下.如果有写得不完整的地方还请补充 说明:本人C#水平可能初级都谈不上,高手轻喷,参考:http://www.c ...

  8. sync_with_stdio

    /* The synchronization referred to is @e only that between the standard * C facilities (e.g., stdout ...

  9. Maven基础知识(转)

    文章摘自http://www.cnblogs.com/xing901022/p/4170248.html 谢谢楼主的总结,界面设计的很好看! 一.什么是Maven Maven是一个用于项目构建的工具, ...

  10. 【LeetCode OJ】Recover Binary Search Tree

    Problem Link: https://oj.leetcode.com/problems/recover-binary-search-tree/ We know that the inorder ...