HDU-2243 考研路茫茫——单词情结(AC自动机)
题目大意:给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自动机)的更多相关文章
- hdu 2243 考研路茫茫——单词情结 AC自动机 矩阵幂次求和
题目链接 题意 给定\(N\)个词根,每个长度不超过\(5\). 问长度不超过\(L(L\lt 2^{31})\),只由小写字母组成的,至少包含一个词根的单词,一共可能有多少个? 思路 状态(AC自动 ...
- hdu 2243 考研路茫茫——单词情结 ac自动机+矩阵快速幂
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2243 题意:给定N(1<= N < 6)个长度不超过5的词根,问长度不超过L(L <23 ...
- HDU 2243 考研路茫茫——单词情结(AC自动机+DP+快速幂)
题目链接 错的上头了... 这题是DNA的加强版,26^1 +26^2... - A^1-A^2... 先去学了矩阵的等比数列求和,学的是第二种方法,扩大矩阵的方法.剩下就是各种模板,各种套. #in ...
- hdu 2243 考研路茫茫——单词情结(AC自动+矩阵)
考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 2243 考研路茫茫——单词情结(AC自动机+矩阵)
考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 2243 考研路茫茫——单词情结
考研路茫茫——单词情结 Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID ...
- hdu_2243_考研路茫茫——单词情结(AC自动机+矩阵)
题目链接:hdu_2243_考研路茫茫——单词情结 题意: 让你求包含这些模式串并且长度不小于L的单词种类 题解: 这题是poj2788的升级版,没做过的强烈建议先做那题. 我们用poj2778的方法 ...
- HDU2243 考研路茫茫——单词情结 ——AC自动机、矩阵优化
题目链接:https://vjudge.net/problem/HDU-2243 考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others) Memor ...
- HDU 2243考研路茫茫——单词情结 (AC自动机+矩阵快速幂)
背单词,始终是复习英语的重要环节.在荒废了3年大学生涯后,Lele也终于要开始背单词了. 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法.比如"ab",放在单词前一般 ...
- HDU 2243 考研路茫茫――单词情结 ——(AC自动机+矩阵快速幂)
和前几天做的AC自动机类似. 思路简单但是代码200余行.. 假设solve_sub(i)表示长度为i的不含危险单词的总数. 最终答案为用总数(26^1+26^2+...+26^n)减去(solve_ ...
随机推荐
- 课程笔记:——Javascript 中的预解释1
1.预解释(变量提升):在当前作用域下,JS代码执行之前,浏览器首先会把所有带var和function关键字的进行提前的声明或者定义var num = 12;声明(declare): var num; ...
- 作业七:团队项目——Alpha版本冲刺阶段007
今日进展:完善游戏主体代码. 今日安排:让游戏能运行起来.
- 如何判断js中的数据类型?
js六大数据类型:number.string.object.Boolean.null.undefined string: 由单引号或双引号来说明,如"string" number: ...
- python 异常处理学习笔记
搬运至慕课网,精华截图,视频链接在这 : http://www.imooc.com/learn/457 1. 异常检查目的 2. python 可能出现的异常 3. 异常的处理过程 try - ex ...
- HighChats图表控件显示精度小数点的方法
相信大家对highchats这个图表控件并不陌生,最近在项目中用到它,但是某些字段需要显示为小数点,顾查找资料文档发现下面两个方式可以实现: 初始化时候添加如下两个参数 tooltip:{ fo ...
- oracle使用sqlplus创建表空间
一.打开命令行窗口,输入以下命令:sqlplus /nolog 回车后,将出现提示符 SQL>, 这时输入conn / as sysdba 一般即可登录,如果失败的话,可以试一下用conn sy ...
- asp.net mvc api auth
一.登录 /// <summary> /// 获取令牌 /// </summary> /// <param name="userName">用户 ...
- html之页面元素印射
首先我遇到了一个问题,尽管不是搞前端开发的但事情交到了我这里就有必要去解决. 而这个问题就是我在这边文本框输入的内容要显示在另一个文本框中其实也是非常简单.但是对于初出茅庐的新手来说就有可能会难倒他. ...
- 配置OpenCV产生flann\logger.h(66): error C4996: 'fopen': This function or variable may be unsafe问题[zz]
使用vs2012/2013配置opencv编译出现问题: 1>------ 已启动生成: 项目: Win32ForOpenCV245, 配置: Debug Win32 ------ 1> ...
- X删除数据表的新用法
删除数据表,可以这样进行,以前傻不拉唧的用sql去手动删除. DAL dal = ... dal.Db.CreateMetaData().SetSche ...