题目链接:hdu_2243_考研路茫茫——单词情结

题意:

让你求包含这些模式串并且长度不小于L的单词种类

题解:

这题是poj2788的升级版,没做过的强烈建议先做那题。

我们用poj2778的方法可以求出不包含这些单词的,然后算出全部种类数,相减就是答案

全部种类数的公式为f[n]=1 + 26^1 + 26^2 +...26^n

AC自动机建出来的矩阵需要在最后添加一列1,这样在矩阵快速幂的时候就能计算出从1~n的幂和

 #include<bits/stdc++.h>
#define mst(a,b) memset(a,b,sizeof(a))
#define F(i,a,b) for(int i=a;i<=b;i++)
typedef unsigned long long ll;
//-----------------------矩阵-------------------------
const int mat_N=*+;//矩阵阶数
int N;
struct mat{
ll c[mat_N][mat_N];
void init(){mst(c,);}
mat operator*(mat b){
mat M;M.init();
F(i,,N)F(j,,N)F(k,,N)M.c[i][j]=M.c[i][j]+c[i][k]*b.c[k][j];
return M;
}
mat operator^(ll k){
mat ans,M=(*this);ans.init();
F(i,,N)ans.c[i][i]=;
while(k){if(k&)ans=ans*M;k>>=,M=M*M;}
return ans;
}
}A;
//-----------------------AC自动机-----------------------
const int AC_N=**,tyn=;//数量乘串长,类型数
struct AC_automation{
int tr[AC_N][tyn],cnt[AC_N],Q[AC_N],fail[AC_N],tot;
inline int getid(char x){return x-'a';}
void nw(){cnt[++tot]=;memset(tr[tot],-,sizeof(tr[tot]));}
void init(){tot=-,fail[]=-,nw();}
void insert(char *s,int x=){
for(int len=strlen(s),i=,w;i<len;x=tr[x][w],i++)
if(tr[x][w=getid(s[i])]==-)nw(),tr[x][w]=tot;
cnt[x]++;//串尾标记
}
void build(int head=,int tail=){
for(Q[++tail]=;head<=tail;){
for(int i=,x=Q[head++],p=-;i<tyn;i++)if(~tr[x][i]){
if(x==)fail[tr[][i]]=;
else for(p=fail[x],fail[tr[x][i]]=;~p;p=fail[p])
if(~tr[p][i]){fail[tr[x][i]]=tr[p][i];break;}
if(cnt[fail[tr[x][i]]])cnt[tr[x][i]]=;
Q[++tail]=tr[x][i];
}else if(x==)tr[x][i]=;
else tr[x][i]=tr[fail[x]][i];
}
}
}AC; void build_mat()
{
A.init();
F(i,,AC.tot)F(j,,)if(!AC.cnt[i]&&!AC.cnt[AC.tr[i][j]])A.c[i][AC.tr[i][j]]++;
N=AC.tot+;
F(i,,N)A.c[i][N]=;//矩阵添加一列1,能将矩阵从1~n的幂和算出来
} ll q_pow(ll k)
{
unsigned long long ans=,tp=;
while(k){if(k&)ans*=tp;k>>=,tp*=tp;}
return ans;
} ll f_ck(ll k)//计算26的从1~k的幂和
{
if(k==)return ;
ll t=;
if(k&)t=q_pow(k);
return (+q_pow(k>>))*f_ck(k>>)+t;
} int main()
{
ll n,m,ans,tp;char buf[];
while(~scanf("%llu%llu",&n,&m))
{
AC.init();
F(i,,n)scanf("%s",buf),AC.insert(buf);
AC.build(),build_mat(),A=A^m,ans=;
F(i,,N)ans+=A.c[][i];
tp=f_ck(m);
printf("%llu\n",tp-ans+);
}
return ;
}

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. [hdu2243]考研路茫茫——单词情结(AC自动机+矩阵快速幂)

    题意:长度不超过L,只由小写字母组成的,至少包含一个词根的单词,一共可能有多少个. 解题关键:利用补集转化的思想,先求一个词根也不包含的单词个数,然后用总的减去即可.长度不超过L需要用矩阵维数增加一倍 ...

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

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

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

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

  6. HDU-2243 考研路茫茫——单词情结(AC自动机)

    题目大意:给n个单词,长度不超过L的单词有多少个包含n个单词中的至少一个单词. 题目分析:用长度不超过L的单词书目减去长度在L之内所有不包含任何一个单词的书目. 代码如下: # include< ...

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

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

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

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

  9. hdu2243 考研路茫茫——单词情结【AC自动机】【矩阵快速幂】

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

随机推荐

  1. Mysql存储过程和函数

    Mysql存储过程和函数 基本概念: 创建存储过程和函数是指将经常使用的一组SQL语句的组合在一起,并将这些SQL语句当作一个整体存储在MySQL服务器中.例如,银行经常需要计算用户的利息.不同类别的 ...

  2. CentOS 7.0 64位 安装TFTP

    1.安装tftp软件# yum -y install tftp*2.修改配置文件 # vi /etc/xinetd.d/tftp server_args = -s /tftpboot '加-cdisa ...

  3. Android中使用OKHttp上传图片,从相机和相册中获取图片并剪切

    效果:注意:1:网络权限<;;;); intent.putExtra(); ); intent.putExtra(); intent.putExtra(, byteArrayOutputStre ...

  4. Delphi @ # $ 特殊字符含义

      ^: 指针   @: 取址  #: 十进制符   $: 十六进制符

  5. openstack私有云布署实践【1 网络拓扑说明】

      图1说明:办公网的openstack使用2台交换机,10.40.40.2是24口  10.40.40.6是48口,管理网段接10.40.40.2VLAN1002     虚拟机的public网段接 ...

  6. 对adapter的封装优化

    一般不优化的adapter通常继承自BaseAdapter会出现一下几个问题: getCount(), getItem(), getItemId()代码都要去重写,一个adapter还行,如果adap ...

  7. Struts2第一天

    Struts2第一天 整体课程安排:3天知识点+2天练习 第一天:入门(action和result结果集)--一般的请求+响应 第二天:请求数据处理相关(参数接收.类型转换.合法性校验.国际化) 第三 ...

  8. Linux用户相关的操作命令

    1.建用户: adduser phpq       //新建phpq用户 passwd phpq        //给phpq用户设置密码 2.建工作组 groupadd test      //新建 ...

  9. HDU 1956 POJ 1637 Sightseeing tour

    混合图的欧拉回路判定方法: 1.首先判断基图是否连通,不连通的话表示不可能,否则进入下一步. 2.对于无向边,随便确定一个方向 3.确定好了之后,整张图就变成了有向图,计算每个节点的入度与出度 4.如 ...

  10. noip2015Day2T1-跳石头

    题目描述 Description 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有N ...