hdu2243考研路茫茫——单词情结(ac+二分矩阵)
跟2778差不多,解决了那道题这道也不成问题如果做过基本的矩阵问题。
数比较大,需要用unsigned longlong 就不需要mod了 溢出就相当于取余
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
#define N 30
#define LL unsigned __int64
#define INF 0xfffffff
#pragma comment(linker, "/STACK:1024000000,1024000000")
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
const int mn = ;
const int child_num = ;
struct Mat
{
LL mat[N][N];
};
Mat operator *(Mat a,Mat b)
{
Mat c;
memset(c.mat,,sizeof(c.mat));
int i,j,k;
for(k = ; k < mn ; k++)
{
for(i = ; i < mn ;i++)
{
if(a.mat[i][k]==) continue;//优化
for(j = ;j < mn ;j++)
{
if(b.mat[k][j]==) continue;//优化
c.mat[i][j] = c.mat[i][j]+(a.mat[i][k]*b.mat[k][j]);
}
}
}
return c;
}
Mat operator + (Mat a,Mat b)
{
Mat c;
memset(c.mat,,sizeof(c.mat));
int i,j;
for(i = ; i < mn ;i++)
for(j = ;j < mn ;j++)
c.mat[i][j] = a.mat[i][j]+b.mat[i][j];
return c;
}
Mat operator ^(Mat a,int k)
{
Mat c;
int i,j;
for(i = ; i < mn ;i++)
for(j = ; j < mn ;j++)
c.mat[i][j] = (i==j);
for(; k ;k >>= )
{
if(k&) c = c*a;
a = a*a;
}
return c;
}
Mat cal(Mat x,int k)
{
if(k==) return x;
Mat c,cc;
c = cal(x,k/);
cc = x^(k/);
c = c+cc*c;
if(k&)
c = c+(x^k);
return c;
}
LL ex_mod(int a,int k)
{
if(k==) return a;
LL t = ex_mod(a,k/);
t = t*t;
if(k&)
t = t*a;
return t;
}
LL solve(int a,int k)
{
if(k==) return a;
LL t = solve(a,k/);
t = t + ex_mod(a,k/)*t;
if(k&) t = t+ex_mod(a,k);
return t;
}
class AC
{
private:
int ch[N][child_num];
int Q[N];
int fail[N];
int val[N];
int sz;
int id[];
public :
void init()
{
fail[] = ;
for(int i = ; i < child_num ; i++)
id[i+'a'] = i;
}
void reset()
{
memset(val,,sizeof(val));
memset(ch[],,sizeof(ch[]));
memset(fail,,sizeof(fail));
sz = ;
}
void insert(char *a,int key)
{
int p = ;
for(; *a ;a++)
{
int d = id[*a];
if(ch[p][d]==)
{
memset(ch[sz],,sizeof(ch[sz]));
ch[p][d] = sz++;
}
p = ch[p][d];
}
val[p] = key;
}
void construct()
{
int i;
int head =, tail=;
for(i = ;i < child_num ;i++)
{
if(ch[][i])
{
fail[ch[][i]] = ;
Q[tail++] = ch[][i];
}
}
while(head!=tail)
{
int u = Q[head++];
val[u]|=val[fail[u]];
for(i= ; i < child_num ; i++)
{
if(ch[u][i])
{
fail[ch[u][i]] = ch[fail[u]][i];
Q[tail++] = ch[u][i];
}
else ch[u][i] = ch[fail[u]][i];
}
}
}
void work(int n)
{
int i;
Mat x;
memset(x.mat,,sizeof(x.mat));
for(i = ; i < sz; i++)
{
for(int j = ; j < child_num ; j++)
if(val[ch[i][j]]==)
x.mat[i][ch[i][j]]++;
}
x = cal(x,n);
LL ans = ;
for(i = ; i < sz ; i++)
ans = ans+x.mat[][i];
ans = solve(,n)-ans;
cout<<ans<<endl;
}
}ac;
char vir[];
int main()
{
int n,l,i;
ac.init();
while(scanf("%d%d",&n,&l)!=EOF)
{
ac.reset();
for(i = ; i <= n; i++)
{
scanf("%s",vir);
ac.insert(vir,);
}
ac.construct();
ac.work(l);
}
return ;
}
hdu2243考研路茫茫——单词情结(ac+二分矩阵)的更多相关文章
- [hdu2243]考研路茫茫——单词情结(AC自动机+矩阵快速幂)
题意:长度不超过L,只由小写字母组成的,至少包含一个词根的单词,一共可能有多少个. 解题关键:利用补集转化的思想,先求一个词根也不包含的单词个数,然后用总的减去即可.长度不超过L需要用矩阵维数增加一倍 ...
- hdu 2243 考研路茫茫——单词情结(AC自动+矩阵)
考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU2243 考研路茫茫——单词情结 ——AC自动机、矩阵优化
题目链接:https://vjudge.net/problem/HDU-2243 考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others) Memor ...
- hdu_2243_考研路茫茫——单词情结(AC自动机+矩阵)
题目链接:hdu_2243_考研路茫茫——单词情结 题意: 让你求包含这些模式串并且长度不小于L的单词种类 题解: 这题是poj2788的升级版,没做过的强烈建议先做那题. 我们用poj2778的方法 ...
- hdu 2243 考研路茫茫——单词情结 AC自动机 矩阵幂次求和
题目链接 题意 给定\(N\)个词根,每个长度不超过\(5\). 问长度不超过\(L(L\lt 2^{31})\),只由小写字母组成的,至少包含一个词根的单词,一共可能有多少个? 思路 状态(AC自动 ...
- HDU-2243 考研路茫茫——单词情结(AC自动机)
题目大意:给n个单词,长度不超过L的单词有多少个包含n个单词中的至少一个单词. 题目分析:用长度不超过L的单词书目减去长度在L之内所有不包含任何一个单词的书目. 代码如下: # include< ...
- hdu 2243 考研路茫茫——单词情结 ac自动机+矩阵快速幂
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2243 题意:给定N(1<= N < 6)个长度不超过5的词根,问长度不超过L(L <23 ...
- hdu2243 考研路茫茫——单词情结【AC自动机】【矩阵快速幂】
考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU2243 考研路茫茫——单词情结(AC自动机+矩阵快速幂)
与POJ2778一样.这题是求长度不超过n且包含至少一个词根的单词总数. 长度不超过n的单词总数记为Sn,长度不超过n不包含词根的单词总数记为Tn. 答案就是,Sn-Tn. Sn=26+262+263 ...
随机推荐
- Java简单类(部门、领导、雇员关系)
class Dept { private int deptno ; private String dname ; private String loc ; private Emp emps [] ; ...
- (转)python爬取拉勾网信息
学习Python也有一段时间了,各种理论知识大体上也算略知一二了,今天就进入实战演练:通过Python来编写一个拉勾网薪资调查的小爬虫. 第一步:分析网站的请求过程 我们在查看拉勾网上的招聘信息的时候 ...
- Inside Flask - flask 扩展加载过程
Inside Flask - flask 扩展加载过程 flask 扩展(插件)通常是以 flask_<扩展名字> 为扩展的 python 包名,而使用时,可用 import flask. ...
- SQL Server ->> EXECUTE AS LOGIN/USER和Revert表达式
EXECUTE AS LOGIN/USER和Revert表达式都是从SQL Server 2005就有.Revert的作用是用于切换当前过程的执行上下文返回上一个EXECUTE AS 语句发生之前的安 ...
- SVD奇异值分解
奇异值分解 备忘:Eigen类库可能会和其他库产生冲突,将Eigen类库的头文件引用放到前面解决了.
- kafka 命令行操作
1.创建主题(topic) bin/kafka-topics.sh --create --zookeeper m6:2181 --replication-factor 1 --partitions 1 ...
- C语言 str2bin 和 bin2str 实现
需求介绍 在编码或者调试过程中经常需要进行 字节码转换为 十六进制的字符串, 或者将 十六进制字符串 转换为 字节码的需求. 即: 字节码 (内存中存储的 01 串): 11111111 &l ...
- EF CodeFirst 如何通过配置自动创建数据库<当模型改变时>
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 本篇为进阶篇,也是弥补自己之前没搞明白的地方,惭愧 ...
- Jquery入门指南教程
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka jQuery,顾名思义,也就是JavaScript和查询(Query),即是辅助JavaScr ...
- 在RedHat/CentOS下安装Docker(不升级内核)
由于内核版本问题,最初仅Ubuntu可以较好的支持Docker.不过,由于RedHat系列OS(REHL.CentOS)是目前主流的Linux服务器操作系统,所以令RedHat系列OS支持Docker ...