HDU-2243 考研路茫茫——单词情结(AC自动机)
题目大意:给n个单词,长度不超过L的单词有多少个包含n个单词中的至少一个单词。
题目分析:用长度不超过L的单词书目减去长度在L之内所有不包含任何一个单词的书目。
代码如下:
# include<iostream>
# include<cstdio>
# include<queue>
# include<cstring>
# include<algorithm>
using namespace std; # define LL long long
# define ULL unsigned long long struct Matrix
{
int n;
ULL ele[35][35];
Matrix(int _n):n(_n){
for(int i=0;i<n;++i) for(int j=0;j<n;++j)
ele[i][j]=0;
}
};
int ch[35][26];
int fail[35],cnt;
bool word[35]; void init()
{
cnt=0;
memset(ch,-1,sizeof(ch));
memset(word,false,sizeof(word));
} int idx(char c)
{
return c-'a';
} void insert(char *s)
{
int n=strlen(s);
int r=0;
for(int i=0;i<n;++i){
int c=idx(s[i]);
if(ch[r][c]==-1) ch[r][c]=++cnt;
r=ch[r][c];
}
word[r]=true;
} void getFail()
{
queue<int>q;
fail[0]=0;
for(int i=0;i<26;++i){
if(ch[0][i]==-1){
ch[0][i]=0;
}else{
fail[ch[0][i]]=0;
q.push(ch[0][i]);
}
}
while(!q.empty())
{
int u=q.front();
q.pop();
if(word[fail[u]]) word[u]=true;
for(int i=0;i<26;++i){
if(ch[u][i]==-1)
ch[u][i]=ch[fail[u]][i];
else{
fail[ch[u][i]]=ch[fail[u]][i];
q.push(ch[u][i]);
}
}
}
} Matrix getMatrix()
{
Matrix mat(cnt+1);
for(int i=0;i<mat.n;++i)
for(int j=0;j<26;++j) if(!word[ch[i][j]])
++mat.ele[i][ch[i][j]];
++mat.n;
for(int i=0;i<mat.n;++i){
mat.ele[mat.n-1][i]=0;
mat.ele[i][mat.n-1]=1;
}
return mat;
} Matrix mul(Matrix a,Matrix b)
{
Matrix c(a.n);
for(int i=0;i<c.n;++i) for(int j=0;j<c.n;++j)
for(int k=0;k<c.n;++k) c.ele[i][j]+=a.ele[i][k]*b.ele[k][j];
return c;
} Matrix myPow(Matrix a,LL k)
{
Matrix mat(a.n);
for(int i=0;i<mat.n;++i) mat.ele[i][i]=1;
while(k>0){
if(k&1) mat=mul(mat,a);
a=mul(a,a);
k>>=1;
}
return mat;
} ULL getSum(LL x)
{
Matrix mat(2);
mat.ele[0][0]=26;
mat.ele[0][1]=1;
mat.ele[1][0]=0;
mat.ele[1][1]=1;
mat=myPow(mat,x);
return mat.ele[0][1];
} char prefix[8]; int main()
{
int n;
LL L;
while(~scanf("%d%lld",&n,&L))
{
init();
for(int i=0;i<n;++i){
scanf("%s",prefix);
insert(prefix);
}
getFail();
Matrix mat=getMatrix();
mat=myPow(mat,L+1);
ULL ans1=mat.ele[0][mat.n-1];
ULL ans2=getSum(L+1);
cout<<ans2-ans1<<endl;
}
return 0;
}
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 ...
- 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 ...
- HDU 2243 考研路茫茫——单词情结(AC自动机+矩阵)
考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 2243 考研路茫茫——单词情结
考研路茫茫——单词情结 Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID ...
- hdu_2243_考研路茫茫——单词情结(AC自动机+矩阵)
题目链接:hdu_2243_考研路茫茫——单词情结 题意: 让你求包含这些模式串并且长度不小于L的单词种类 题解: 这题是poj2788的升级版,没做过的强烈建议先做那题. 我们用poj2778的方法 ...
- HDU2243 考研路茫茫——单词情结 ——AC自动机、矩阵优化
题目链接:https://vjudge.net/problem/HDU-2243 考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others) Memor ...
- HDU 2243考研路茫茫——单词情结 (AC自动机+矩阵快速幂)
背单词,始终是复习英语的重要环节.在荒废了3年大学生涯后,Lele也终于要开始背单词了. 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法.比如"ab",放在单词前一般 ...
- HDU 2243 考研路茫茫――单词情结 ——(AC自动机+矩阵快速幂)
和前几天做的AC自动机类似. 思路简单但是代码200余行.. 假设solve_sub(i)表示长度为i的不含危险单词的总数. 最终答案为用总数(26^1+26^2+...+26^n)减去(solve_ ...
随机推荐
- C# Lamada表达式
Lambda表达式 "Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量.它可以包含表达式和语句,并且可用于创建委托 ...
- a标签
a链接是一种触发行为元素,行内元素 属性:href/target/class/id/title href: <a href="www.baidu.com"></a ...
- selenium配置
1.firebug安装--火狐插件 2.firepath安装--火狐插件 3.
- 【转】 Linux shell的&&和||
http://www.2cto.com/os/201302/189655.html Linux shell的&&和|| shell 在执行某个命令的时候,会返回一个返回值,该返回值 ...
- HBase的基本架构及其原理介绍
1.概述:最近,有一些工程师问我有关HBase的基本架构的问题,其实这个问题仅仅说架构是非常简单,但是需要理解.在这里,我觉得可以用HDFS的架构作为借鉴.(其实像Hadoop生态系统中的大部分组建的 ...
- leetcode216-Combination Sum III
https://leetcode.com/problems/combination-sum-iii/ 用dfs枚举. class Solution { public: int kk, nn; vect ...
- Java记事本编译
配置环境: 在“系统变量”栏下执行三项操作:①新建“Java_Home”,设置其值为 JDK所在的绝对路径,如果你的事刚才的默认路径,那值为:C:\Program Files\Java\jdk1.7. ...
- tabhost使用
Tabhost用法 使用方法一:使用同一个布局文件 在xml中如此定义tabhost: <RelativeLayout xmlns:android="http://schemas.an ...
- 对字符串进行简单的字符数字统计 探索java中的List功能
题目: 统计一个字符串中数字和字符串的个数,并分别进行排列,要求 1.数字,字符串可以从键盘获取. 2.储存在list 3.统计数字个数,字符串个数 4.把数字和字符串按从小到大的顺序输出 5.不能使 ...
- Error: unable to connect to node rabbit@mail: nodedown
某天,开启一个应用时,发现连接rabbitmq失败,本来想用rabbitmqctl来查看队列,结果提示“Error: unable to connect to node rabbit@mail: no ...