Problem 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
 
Author
linle
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<iomanip>
#define ll unsigned __int64
using namespace std; ll N,L,e;
char ts[][],s[];
//int nextt[10],match[10];
//bool visit[10];
//bool kmp(char sa[],char sb[])
//{
// nextt[1] = 0;
// int i,j,k,l1 = strlen(sa+1),l2 = strlen(sb+1);
// for(i = 2;i<=l1;i++)
// {
// ll t = nextt[i-1];
// while(t&&sa[i]!=sa[t+1]) t = nextt[t];
// if(sa[i] == sa[t+1]) t++;
// nextt[i] = t;
// }
// match[0] = 0;
// for(i = 1;i<=l2;i++)
// {
// ll t = match[i-1];
// while(t&&sb[i]!=sa[t+1]) t = nextt[t];
// if(sb[i] == sa[t+1]) t++;
// match[i] = t;
// if(t == l1) return 1;
// }
// return 0;
//}
struct mtr
{
ll an[][];
};
mtr tmmmt;
mtr mul(mtr a,mtr b)
{
mtr c;
memset(c.an,,sizeof(c.an));
int i,j,k;
for(i = ;i<e;i++)
for(j = ;j<e;j++)
for(k = ;k<e;k++)
c.an[i][j] += a.an[i][k]*b.an[k][j];
return c;
}
mtr mpow(mtr a,ll t)
{
mtr r;
int i,j;
memset(r.an,,sizeof(r.an));
for(i = ;i<e;i++)
r.an[i][i] = ;
while(t)
{
if(t%) r = mul(r,a);
a = mul(a,a);
t/=;
}
return r;
}
struct node
{
node* nextt[],*fail;
ll num;
node()
{
for(ll i = ;i<;i++)
nextt[i] = NULL;
fail = NULL;
num = e;
}
};
node* root;
void insert()
{
ll l = strlen(s),i;
node* k = root;
for(i = ;i<l;i++)
{
ll id = s[i]-'a';
if(k->nextt[id] == NULL)
{
k->nextt[id] = new node();
if(i != l-) e++;
}
k = k->nextt[id];
}
k->num = ;
}
void build()
{
queue<node*> q;
node* k = root;
for(ll i = ;i<;i++)
if(k->nextt[i]!=NULL)
{
k->nextt[i]->fail = k;
q.push(k->nextt[i]);
}
while(!q.empty())
{
node* k = q.front();
q.pop();
for(ll i = ;i<;i++)
if(k->nextt[i] != NULL)
{
node* t = k->fail;
while(t!=root&&t->nextt[i] == NULL) t = t->fail;
if(t->nextt[i]!=NULL) t = t->nextt[i];
k->nextt[i]->fail = t;
q.push(k->nextt[i]);
}
}
} void ask()
{
queue<node*> q;
q.push(root);
while(!q.empty())
{
node* k = q.front();
q.pop();
ll a = k->num;
if(a == ) continue;
for(ll i = ;i<;i++)
{
node* temp = k;
bool bl = ;
while(temp!=NULL)
{
ll b = ;
if(temp->nextt[i]!=NULL) b = temp->nextt[i]->num;
if(b == )
{
bl = ;
tmmmt.an[b][a]++;
break;
}
temp = temp->fail;
}
if(!bl) continue;
temp = k;
while(temp!=NULL)
{
if(temp->nextt[i]!=NULL)
{
ll b = temp->nextt[i]->num;
tmmmt.an[b][a]++;
bl = ;
break;
}
temp = temp->fail;
}
if(bl) tmmmt.an[][a]++;
if(k->nextt[i]!=NULL) q.push(k->nextt[i]);
}
}
} int main()
{
int i,j,k;
while(cin>>N>>L)
{
e = ;
memset(tmmmt.an,,sizeof(tmmmt.an));
root = new node();
e++;
for(i = ;i<N;i++) scanf("%s",s),insert();
// for(i = 0;i<N;i++)
// {
// if(visit[i]) continue;
// for(j = 0;j<N;j++)
// {
// if(i == j) continue;
// if(kmp(ts[i],ts[j]))
// visit[j] = 1;
// }
// }
// for(i = 0;i<N;i++)
// {
// //if(visit[i]) continue;
// ll l = strlen(ts[i]+1);
// for(j = 0;j<=l;j++)
// s[j] = ts[i][j+1];
// insert();
// }
build();
ask();
tmmmt.an[][] = ;
// for(j = 0;j<e;j++)
// {
// ll sum = 0;
// for(i = 0;i<e;i++)
// {
// sum+=tmmmt.an[i][j];
// }
// tmmmt.an[1][j] = 26-sum;
// }
tmmmt.an[e][] = tmmmt.an[e][e] = ;
e++;
// for(i = 1;i<e-1;i++)
// {
// for(j = 1;j<e-1;j++)
// {
// cout<<setw(3)<<tmmmt.an[i][j];
// }
// cout<<endl;
// }
tmmmt = mpow(tmmmt,L+);
// for(i = 0;i<e;i++)
// {
// for(j = 0;j<e;j++)
// {
// cout<<tmmmt.an[i][j]<<" ";
// }
// cout<<endl;
// }
printf("%I64u\n",tmmmt.an[e-][]);
}
return ;
}

尼玛可算是过啦

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 考研路茫茫――单词情结

    Description 背单词,始终是复习英语的重要环节.在荒废了3年大学生涯后,Lele也终于要开始背单词了. 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法.比如"ab&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. Android图片编译报错

    一. AAPT err(1118615418): ERROR: 9-patch image icon_item_bottom_line.9.png malformed No marked region ...

  2. OCMOCM

    14年,OCM考试费12000 15年,考试费19800 对于我来说,1,2年之后是否换工作还是个未知数 在本单位考这个貌似没什么用处,工资也不会突然就涨很多 跳槽的话,专门做数据库感觉压力还挺大 年 ...

  3. 安装apache mysql 论坛(一)

    安装mysql: 注: yum文件配置: 检查配置文件: 启动:service mysqld start 查询表: apache安装 启动: 查看端口: 欢迎界面: 如果服务了4000次,会主动销毁, ...

  4. Win7 64位系统上配置使用32位的Eclipse(转)

    Win7 64位系统上配置使用32位的Eclipse 博客分类: Eclipse eclipse  最近工作电脑换成了64位的win7系统,之前个人电脑上安装的jdk和Eclipse都是32位的.而新 ...

  5. java基础之 第一步 :jdk安装配置

    Java 开发环境配置 在本章节中我们将为大家介绍如何搭建Java开发环境. window系统安装java 下载JDK 首先我们需要下载java开发工具包JDK,下载地址:http://www.ora ...

  6. Single Number,Single Number II

    Single Number Total Accepted: 103745 Total Submissions: 218647 Difficulty: Medium Given an array of ...

  7. CDZSC_2015寒假新人(1)——基础 c

    Description FatMouse prepared M pounds of cat food, ready to trade with the cats guarding the wareho ...

  8. phpstorm8 配置svn

    步骤1 步骤2. 步骤3.

  9. MySQL server has gone away报错

    1.最近做插入数据库,然后一直报一个错.mysql server has gone away.(如下图) 查了好多资料,终于解决了.. 1.可能是连接超时..进入php.ini,修改wait_time ...

  10. 关于cookie的使用

    cookie的属性 domain:域名,即cookie所能使用的范围,当然当前域下可以在当前域下cookie,还有一个就是该域名的父级域名(子级的域名下是可以访问父级域名下的cookie,父级域名是不 ...