Description

背单词,始终是复习英语的重要环节。在荒废了3年大学生涯后,Lele也终于要开始背单词了。 
一天,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

2 3
aa ab
1 2
a
 

Sample Output

104
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 考研路茫茫――单词情结的更多相关文章

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

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

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

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

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

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

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

    与POJ2778一样.这题是求长度不超过n且包含至少一个词根的单词总数. 长度不超过n的单词总数记为Sn,长度不超过n不包含词根的单词总数记为Tn. 答案就是,Sn-Tn. Sn=26+262+263 ...

  5. hdu2243考研路茫茫——单词情结

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

  6. 【AC自动机】【矩阵乘法】【等比数列】hdu2243 考研路茫茫——单词情结

    题解:http://blog.csdn.net/xingyeyongheng/article/details/10005923 这里采用了二分法求等比数列前n项和. 等比数列前n项和也可以用矩乘快速幂 ...

  7. [hdu2243]考研路茫茫——单词情结(AC自动机+矩阵快速幂)

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

  8. hdu2243考研路茫茫——单词情结(ac+二分矩阵)

    链接 跟2778差不多,解决了那道题这道也不成问题如果做过基本的矩阵问题. 数比较大,需要用unsigned longlong 就不需要mod了 溢出就相当于取余 #include <iostr ...

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

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

随机推荐

  1. SpringMVC框架(三)from标签(转)

    原文地址:http://blog.csdn.net/kutim/article/details/46682547 spring表单标签   <%@taglib uri="http:// ...

  2. iOS UI特效

    1.iOS特效 a.对应APP中的基本动作分三类: 1.指向性动效(滑动,弹出等) 2.提示性动效(滑动删除,下拉刷新等) 3.空间扩展(翻动,放大等) b.这类动效在设计过程中需要主意几点: 1.系 ...

  3. boost::format(字符串格式化库)

    这段时间学习boost库的使用,撰文一方面留以备用,另一方面就是shared精神. format主要是用来格式化std::string字符串以及配合std::cout代替C语言printf() 使用f ...

  4. Linux服务器上的oracle数据导入和导出

    背景: 在同一台Linux服务器上,有两个数据库用户,分别为:database1,database2,如何把database1用户下面的所有的表和数据,导入到database2数据库(database ...

  5. 视觉SLAM的数学表达

    相机是在某些时刻采集数据的,所以只关心这些时刻的位置和地图. 就把这一段时间的运动变成了李三时刻 t=1,2,...K当中发生的事情. 在这些事可,x表示机器自身的位置. x1,x2,x3,x4... ...

  6. Clonezilla SE---克隆linux------转载

    引入: 本博文将会是<学生机房中的虚拟化>专题中的核心内容.因为,通过本篇博文的讲述,大家可以看到用于网络化批量部署Linux系统的Clonezilla SE搭建的全过程.注意,几乎所有命 ...

  7. Python学习(四):模块入门

    1.模块介绍 模块:代码实现的某个功能的集合 模块分类: 自定义模块 内置标准模块 开源模块 模块的常用方法: 是否为主文件:__name__ == '__main__' 如果是直接执行的某程序,那么 ...

  8. jquery获取焦点和失去焦点事件代码

    input失去焦点和获得焦点 鼠标在搜索框中点击的时候里面的文字就消失了. 我们在做网站的时候经常会用到搜索框的获得焦点和失去焦点的事件,因为懒,每次都去写非常的烦,于是就一劳永逸,遇到类似情况就来调 ...

  9. Python-String字符串的相关方法

  10. Linux下磁盘监控及系统版本-CPU-内存等查看

    1.磁盘IO监控工具 iotop 输入命令:iotop   主要查看程序使用的磁盘IO的信息 安装:yum -y install iotop 第一行:10:01:23 — 当前系统时间126 days ...