hdu2243 考研路茫茫——单词情结【AC自动机】【矩阵快速幂】
考研路茫茫——单词情结
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7136 Accepted Submission(s): 2502
一天,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实在是数不出来了,现在就请你帮帮他。
每组数据占两行。
第一行有两个正整数N和L。(0<N<6,0<L<2^31)
第二行有N个词根,每个词根仅由小写字母组成,长度不超过5。两个词根中间用一个空格分隔开。
由于结果可能非常巨大,你只需要输出单词总数模2^64的值。
aa ab
1 2
a
52
题意:
给定$n$个字符串,问长为$l$的串,有多少个里面含有给定的这些字符串之一。
思路:
之前poj2778 https://www.cnblogs.com/wyboooo/p/9899944.html这道题求得是不含有字符串的情况。
那么这道题其实可以转换为,所有的情况减去不含有这些字符串的情况。
建立AC自动机,然后根据标记建立矩阵,矩阵快速幂$l+1$的幂次。
因为长度是小于等于$l$的都行,所以做$l+1$,这里会超$int$
然后对矩阵
$$
\begin{matrix}
26 & 0 \\
1 & 1
\end {matrix}
$$做$l$次快速幂,结果的第二行第一列乘26就是总的个数。
#include<iostream>
#include<bits/stdc++.h>
#include<cstdio>
#include<cmath>
//#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
//#include<set>
//#include<climits>
//#include<map>
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
#define pi 3.1415926535
#define inf 0x3f3f3f3f const int maxn = ;
struct Tree{
int fail;
int son[];
int ed;
}AC[maxn];
int tot = ; void init()
{
for(int i = ; i <= tot; i++){
AC[i].fail = ;
AC[i].ed = ;
memset(AC[i].son, , sizeof(AC[i].son));
}
tot = ;
} void build(string s)
{
int len = s.length();
int now = ;
for(int i = ; i < len; i++){
if(AC[now].son[s[i] - 'a'] == ){
AC[now].son[s[i] - 'a'] = ++tot;
}
now = AC[now].son[s[i] - 'a'];
}
AC[now].ed += ;
} void get_fail()
{
queue<int>que;
AC[].fail = ;
for(int i = ; i < ; i++){
if(AC[].son[i] != ){
AC[AC[].son[i]].fail = ;
que.push(AC[].son[i]);
}
}
while(!que.empty()){
int u = que.front();
que.pop();
if(AC[AC[u].fail].ed)AC[u].ed++;
for(int i = ; i < ; i++){
if(AC[u].son[i] != ){
AC[AC[u].son[i]].fail = AC[AC[u].fail].son[i];
que.push(AC[u].son[i]);
}
else{
AC[u].son[i] = AC[AC[u].fail].son[i];
}
}
}
} struct matrix{
ull m[maxn][maxn];
int n;
matrix(){}
matrix(int _n)
{
n = _n;
for(int i = ; i < n; i++){
for(int j = ; j < n; j++){
m[i][j] = ;
}
}
}
matrix operator *(const matrix &b)const{
matrix ret = matrix(n);
//memset(ret.m, 0x3f, sizeof(ret.m));
for(int i = ; i < n; i++){
for(int j = ; j < n; j++){
for(int k = ; k < n; k++){
ret.m[i][j] += m[i][k] * b.m[k][j];
}
}
}
return ret;
}
void debug()
{
for(int i = ; i < n; i++){
for(int j = ; j <n; j++){
printf("%llu ", m[i][j]);
}
cout<<endl;
}
}
}g; ull pow_m(ull a, int n)
{
ull ret = ;
ull tmp = a;
while(n){
if(n & )ret *= tmp;
tmp *= tmp;
n >> ;
}
return ret;
} matrix pow_M(matrix a, ull x)
{
//a.debug();
matrix ret = matrix(a.n);
for(int i = ; i < a.n; i++){
ret.m[i][i] = ;
}
matrix tmp = a;
while(x){
if(x & )ret = ret * tmp;
tmp = tmp * tmp;
//tmp.debug();
//ret.debug();cout<<endl;
x >>= ;
}
return ret;
} matrix get_matrix()
{
matrix ret = matrix(tot + );
for(int i = ; i < tot; i++){
if(AC[i].ed)continue;
for(int j = ; j < ; j++){
if(AC[AC[i].son[j]].ed == false){
ret.m[i][AC[i].son[j]]++;
}
}
}
for(int i = ; i < tot + ; i++){
ret.m[i][tot] = ;
}
return ret;
} int n;
ull l;
int main()
{
while(scanf("%d%I64u", &n, &l) != EOF){
init();
for(int i = ; i < n; i++){
string s;
cin>>s;
build(s);
}
//cout<<l<<endl;
get_fail();
g = get_matrix();
//g.debug();
g = pow_M(g, l + );
//g.debug();
ull res = ;
/*for(int i = 0; i < g.n; i++){
res += g.m[0][i];
}*/
res = g.m[][tot] - ;
matrix T = matrix();
//S.m[0][0] = 26;S.m[1][0] = 0;
T.m[][] = ;T.m[][] = ;
T.m[][] = ;T.m[][] = ;
T = pow_M(T, l);
printf("%I64u\n", T.m[][] * - res);
}
return ;
}
hdu2243 考研路茫茫——单词情结【AC自动机】【矩阵快速幂】的更多相关文章
- [hdu2243]考研路茫茫——单词情结(AC自动机+矩阵快速幂)
题意:长度不超过L,只由小写字母组成的,至少包含一个词根的单词,一共可能有多少个. 解题关键:利用补集转化的思想,先求一个词根也不包含的单词个数,然后用总的减去即可.长度不超过L需要用矩阵维数增加一倍 ...
- 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 ...
- 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自动+矩阵)
考研路茫茫——单词情结 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 ...
随机推荐
- __stdio_common_vsnprintf_s,该符号在函数 _vsnprintf_s_l 中被引用
在链接 输入里加入:ucrtd.lib
- s3cmd用法总结
概述 S3是亚马逊AWS提供的简单存储服务(可以理解为有公网域名的大容量高可用存储) S3配合CloudFront服务可作为CDN使用,它提供多节点全球发布 安装 方法一: yum install s ...
- Java日志框架(Commons-logging,SLF4j,Log4j,Logback)
简介 在系统开发中,日志是很重要的一个环节,日志写得好对于我们开发调试,线上问题追踪等都有很大的帮助.但记日志并不是简单的输出信息,需要考虑很多问题,比如日志输出的速度,日志输出对于系统内存,CPU的 ...
- linux下编译安装pthreads扩展
这里讲的是如何编译安装pthreads,以后编译安装其他PHP扩展可以参考此方法. 下载pthreads源码:http://pecl.php.net/package/pthreads 首先确定安装的p ...
- [k8s]k8s配置nfs做后端存储&配置多nginx共享存储&&statefulset配置
所有节点安装nfs yum install nfs-utils rpcbind -y mkdir -p /ifs/kubernetes echo "/ifs/kubernetes 192.1 ...
- 最简单的基于FFmpeg的AVfilter样例(水印叠加)
===================================================== 最简单的基于FFmpeg的AVfilter样例系列文章: 最简单的基于FFmpeg的AVfi ...
- MYSQL 线程池
https://www.jianshu.com/p/88e606eca2a5 https://www.percona.com/doc/percona-server/LATEST/performance ...
- [Big Data - Codis] Codis集群的搭建与使用
一.简介 Codis是一个分布式的Redis解决方案,对于上层的应用来说,连接Codis Proxy和连接原生的Redis Server没有明显的区别(不支持的命令列表),上层应用可以像使用单机的Re ...
- Python(十)之GUI编程
在windwos上实现:使用wxPython模块 #!/usr/bin/env python # encoding: utf-8 import wx #创建open按钮触发的事件对应的函数 def l ...
- centos7系统下安装php-fpm并配置nginx支持并开启网站gzip压缩
注:此处不介绍nginx的安装.以下教程默认已安装nginx. 1. yum install -y php-fpm yum install php-pdo yum install php-mysql ...