hdu_2243_考研路茫茫——单词情结(AC自动机+矩阵)
题目链接: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自动机+矩阵)的更多相关文章
- 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 ...
- [hdu2243]考研路茫茫——单词情结(AC自动机+矩阵快速幂)
题意:长度不超过L,只由小写字母组成的,至少包含一个词根的单词,一共可能有多少个. 解题关键:利用补集转化的思想,先求一个词根也不包含的单词个数,然后用总的减去即可.长度不超过L需要用矩阵维数增加一倍 ...
- hdu 2243 考研路茫茫——单词情结(AC自动+矩阵)
考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU2243 考研路茫茫——单词情结 ——AC自动机、矩阵优化
题目链接:https://vjudge.net/problem/HDU-2243 考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others) Memor ...
- HDU-2243 考研路茫茫——单词情结(AC自动机)
题目大意:给n个单词,长度不超过L的单词有多少个包含n个单词中的至少一个单词. 题目分析:用长度不超过L的单词书目减去长度在L之内所有不包含任何一个单词的书目. 代码如下: # include< ...
- 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 ...
- hdu2243 考研路茫茫——单词情结【AC自动机】【矩阵快速幂】
考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
随机推荐
- HDU 2177 取(2堆)石子游戏 (威佐夫博弈)
题目思路:威佐夫博弈: 当当前局面[a,b]为奇异局时直接输出0 否则: 1.若a==b,输出(0 0): 2.将a,b不停减一,看能否得到奇异局,若有则输出: 3.由于 ak=q*k(q为黄金分割数 ...
- Kettle 使用相关
Kettle 作为国外的一款开源ETL软件,要使用了
- python join()阻塞的用法
join()阻塞的用法,用来检测线程有没有完全执行完毕 #!/usr/bin/env python#-*- coding:utf-8 -*-import threadingimport time de ...
- sqlserver2012评估期已过问题处理
于之前安装sqlserver2012忘记输入序列号,现在出现评估期已过的问题,网上忙活半天,才解决,发现网上叙述都很凌乱,而且只有大意,新手很难操作,所以把我操作的过程分享给大家 步骤阅读 百度经 ...
- Note_JavaWeb_Jars
- JS复习:第二十章
一.JSON 1.JSON的语法可以表示以下三种类型的值: (1)简单值:字符串.数值.布尔值和null.如:5,“Hello,World!” (2)对象:javascript中对象字面量: var ...
- Python虚拟环境的配置
Python中,配置虚拟环境主要是为了防止版本之间的冲突,我是这么理解的: 1.用虚拟环境可以在一个电脑中使用多个Python解释器以及扩展: 2.可以方便的在同一台电脑中使用多个版本的代码. 虚拟环 ...
- 同一级目录js的引入
- input美化上传按钮美化
今天工作需求碰到 样式改变上传按钮 效果: <a href="javascript:;" class="a-upload"> <input t ...
- 浙江大学Pat 1036 题解
1036. Boys vs Girls (25) This time you are asked to tell the difference between the lowest grade of ...