HDU2243 考研路茫茫――单词情结
Description
一天,Lele在某本单词书上看到了一个根据词根来背单词的方法。比如"ab",放在单词前一般表示"相反,变坏,离去"等。
于是Lele想,如果背了N个词根,那这些词根到底会不会在单词里出现呢。更确切的描述是:长度不超过L,只由小写字母组成的,至少包含一个词根的单词,一共可能有多少个呢?这里就不考虑单词是否有实际意义。
比如一共有2个词根 aa 和 ab ,则可能存在104个长度不超过3的单词,分别为
(2个) aa,ab,
(26个)aaa,aab,aac...aaz,
(26个)aba,abb,abc...abz,
(25个)baa,caa,daa...zaa,
(25个)bab,cab,dab...zab。
这个只是很小的情况。而对于其他复杂点的情况,Lele实在是数不出来了,现在就请你帮帮他。
Input
每组数据占两行。
第一行有两个正整数N和L。(0<N<6,0<L<2^31)
第二行有N个词根,每个词根仅由小写字母组成,长度不超过5。两个词根中间用一个空格分隔开。
Output
由于结果可能非常巨大,你只需要输出单词总数模2^64的值。
Sample Input
aa ab
1 2
a
Sample Output
52
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; inline int f(char u){
return u-'a';
}
struct tree{
int f;
bool w;
int t[];
}t[];
int n,m,num=;
struct MX{
unsigned long long c[][];
};
char s[];
bool ma[],us[];
queue <int> q;
MX a,o;
inline bool dfs(int x){
if (x==) return ;
if (t[x].w) return ;
if (us[x]) return ma[x];
us[x]=;
return ma[x]=dfs(t[x].f);
}
inline void in(){
int p=,l,m=strlen(s);
for (register int i=;i<m;i++){
l=f(s[i]);
if (!t[p].t[l]) t[p].t[l]=++num;
p=t[p].t[l];
}
t[p].w=;
}
inline void mafa(){
register int i;int k,p;
q.push();t[].f=;
while(!q.empty()){
k=q.front();q.pop();
for (i=;i<;i++)
if (t[k].t[i]){
p=t[k].f;
while((!t[p].t[i])&&p) p=t[p].f;
t[t[k].t[i]].f=(k==p)?:t[p].t[i];
q.push(t[k].t[i]);
}
}
}
inline MX cheng(MX x,MX y){
register int i,j,k;
MX z;
for (i=;i<=num;i++)
if (ma[i])
for (j=;j<=num;j++)
if (ma[j]){
z.c[i][j]=;
for (k=;k<=num;k++)
if (ma[k])
z.c[i][j]+=x.c[i][k]*y.c[k][j];
}
return z;
}
inline MX mi(MX x,int b){
register int i,j;
MX z=x;b--;
while(b){
if (b&) z=cheng(z,x);
b>>=;
x=cheng(x,x);
}
return z;
}
int main(){
register int i,j;int u;
unsigned long long ans;
while(~scanf("%d%d",&n,&m)){
u=ans=;
for (i=;i<=num;i++)
for (j=;j<;j++) t[i].t[j]=;
for (i=;i<=num;i++) ma[i]=us[i]=t[i].w=t[i].f=;
num=;
a.c[][]=;
a.c[][]=a.c[][]=;
ma[]=ma[]=;
o=mi(a,m);
ma[]=ma[]=;
ans=o.c[][]+o.c[][];
for (i=;i<=num;i++)
for (j=;j<=num;j++)
a.c[i][j]=;
num=;
for (i=;i<=n;i++){
scanf("%s",s);
in();
}
mafa();
for (i=;i<=num;i++)
ma[i]=dfs(i);
for (i=;i<=num;i++)
if (ma[i])
for (j=;j<;j++){
if (!t[i].t[j]){
u=t[i].f;
while(!t[u].t[j]&&u)u=t[u].f;
u=t[u].t[j];
}else u=t[i].t[j];
a.c[i][u]++;
}
num++;
ma[num]=;
for (i=;i<=num;i++) a.c[i][num]=;
o=mi(a,m);
for (i=;i<=num;i++)
if (ma[i])
ans-=o.c[][i];
for (i=;i<=num;i++)
for (j=;j<=num;j++)
a.c[i][j]=;
printf("%llu\n",ans);
}
}
HDU2243 考研路茫茫――单词情结的更多相关文章
- HDU2243 考研路茫茫——单词情结 ——AC自动机、矩阵优化
题目链接:https://vjudge.net/problem/HDU-2243 考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others) Memor ...
- hdu2243 考研路茫茫——单词情结【AC自动机】【矩阵快速幂】
考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU-2243 考研路茫茫——单词情结(AC自动机)
题目大意:给n个单词,长度不超过L的单词有多少个包含n个单词中的至少一个单词. 题目分析:用长度不超过L的单词书目减去长度在L之内所有不包含任何一个单词的书目. 代码如下: # include< ...
- HDU2243 考研路茫茫——单词情结(AC自动机+矩阵快速幂)
与POJ2778一样.这题是求长度不超过n且包含至少一个词根的单词总数. 长度不超过n的单词总数记为Sn,长度不超过n不包含词根的单词总数记为Tn. 答案就是,Sn-Tn. Sn=26+262+263 ...
- hdu2243考研路茫茫——单词情结
Problem Description 背单词,始终是复习英语的重要环节.在荒废了3年大学生涯后,Lele也终于要开始背单词了. 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法.比如&q ...
- 【AC自动机】【矩阵乘法】【等比数列】hdu2243 考研路茫茫——单词情结
题解:http://blog.csdn.net/xingyeyongheng/article/details/10005923 这里采用了二分法求等比数列前n项和. 等比数列前n项和也可以用矩乘快速幂 ...
- [hdu2243]考研路茫茫——单词情结(AC自动机+矩阵快速幂)
题意:长度不超过L,只由小写字母组成的,至少包含一个词根的单词,一共可能有多少个. 解题关键:利用补集转化的思想,先求一个词根也不包含的单词个数,然后用总的减去即可.长度不超过L需要用矩阵维数增加一倍 ...
- hdu2243考研路茫茫——单词情结(ac+二分矩阵)
链接 跟2778差不多,解决了那道题这道也不成问题如果做过基本的矩阵问题. 数比较大,需要用unsigned longlong 就不需要mod了 溢出就相当于取余 #include <iostr ...
- HDU 2243 考研路茫茫——单词情结(AC自动机+矩阵)
考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
随机推荐
- python爬虫小结1
先看正则化,正则化就是描述命令和字符切分.查找.筛选等功能的方便方式. http://www.cnblogs.com/fnng/archive/2013/05/20/3089816.html 一个游戏 ...
- C#Linq技术中SelectMany(...)函数的内部实现的伪代码
我们先来假设这种场景: 一个学校中有多个年级,一个年级有多个班级,一个班级里有多个学生.这里我们只需要班级.年级.和学生这三个概念: 让我们先来定义Class类和Student类: // 注意,Cla ...
- 点击button1弹出form2,并在form2中点击button2来调用form1的方法
链接地址:http://www.sufeinet.com/thread-1273-1-1.html 1. private void button1_Click(object sender, ...
- LAMP第三部分php,mysql配置
php配置 1. 配置disable_functiondisable_functions = eval,assert,popen,passthru,escapeshellarg,escapeshell ...
- HTTPS从认识到线上实战全记录
前言 关于HTTPS,基本上你想知道的都在这里了.本文原标题<HTTPS原理与实践>,下图是本文配套PPT的目录截图: [TOC] 原理篇 认识HTTPS 先说一下,本文可能有些地方由于描 ...
- python 小脚本升级-- 钉钉群聊天机器人
一则小脚本(工作中用) 在这篇文章中写的监控的脚本,发送监控的时候 是利用的邮箱,其实在实际,邮箱查收有着不方便性,于是乎升级, 我们工作中,经常用钉钉,那么如果要是能用到钉钉多好,这样我们的监控成功 ...
- HBase资料
http://blog.csdn.net/ymh198816/article/details/51244911 https://www.cnblogs.com/JingJ/p/4521245.html ...
- C#中DataGridView动态添加行及添加列的方法
http://www.jb51.net/article/72259.htm Datagridview添加列: ? 1 2 3 4 5 DataGridViewTextBoxColumn acCode ...
- python科学计算_numpy_函数库
1.常规函数与排序 常用统计函数: 求和:sum().均值:mean().标准差:std().方差:var().最小值:min().最大值:max().最大值与最小值之差:ptp().最大值的下标:a ...
- python中的if __name__=='__main__': main()解析
python中我们会看到一段代码是这样的: if __name__=='__main__': main() 这段代码的什么意思,我们可以知道代码的意思是如果__name__=='__main__'为T ...