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 ...
随机推荐
- JavaWeb之ssm框架整合,用户角色权限管理
SSM框架整合 Spring SpringMVC MyBatis 导包: 1, spring 2, MyBatis 3, mybatis-spring 4, fastjson 5, aspectwea ...
- android中的五大布局(控件的容器,可以放button等控件)
一.android中五大布局相当于是容器,这些容器里可以放控件也可以放另一个容器,子控件和布局都需要制定属性. 1.相对布局:RelativeLayout @1控件默认堆叠排列,需要制定控件的相对位置 ...
- 尝试在条件“$(_DeviceSdkVersion) >= 21”中对计算结果为“”而不是数字的“$(_DeviceSdkVersion)
晚上搞xamarin ,运行xamarin项目好好的,不知道怎么回事,一次运行xamarin android项目的时候,部署失败,以前也是遇到这样的错误. 尝试在条件"$(_DeviceSd ...
- Netty-Websocket 根据URL路由,分发机制的实现
最近在做netty整合websocket,发现网上很多项目都是最简单的demo,单例的一个项目. 然而公司的项目需要接受几个不同功能的ws协议消息,因此最好是用URL来区分,让页面上采用不同的链接方式 ...
- Illustration of Git branching and merge
网上看到的描述Git工作流程的图片,有些出处忘了保存,仅供学习. 1. One Git Branching Model 出处: http://nvie.com/posts/a-successful-g ...
- 8、公司的上市问题 - CEO之公司管理经验谈
在公司发展到一定阶段之后,CEO就能够考虑公司上市的问题了.一条线路,就是先成立公司,进行投资,然后上市赚取利润,根据不同公司的总经理的想法不同而定.这条路是现在很多公司领导要求的做法.因为,通过发行 ...
- 由浅入深理解Java线程池及线程池的如何使用
前言 多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担.线程本身也要占用内存空间,大量的线程会占用内存资源并且可能会导致Out of Memory ...
- IndentationError: unexpected indent
都知道python是对格式要求很严格的,写了一些python但是也没发现他严格在哪里,今天遇到了IndentationError: unexpected indent错误我才知道他是多么的严格. ...
- JavaScript 浏览器类型及版本号
项目中偶尔用到判断浏览器类型及相关版本问题,现记录相关代码: function getBrowserVertion(userAgent) { var browserName, browserVersi ...
- jq选择器汇总
$("div") //标签 $(".box") //类 $("#box") //ID $("a[href][name]" ...