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 ...
随机推荐
- 纯CSS实现tooltip提示框,CSS箭头及形状之续篇--给整个tooltip提示框加个边框
在前面一篇中我们介绍了纯CSS实现tooltip提示框,通俗的讲也就是CSS箭头及形状 不过注意一点是,他始终是一个元素,只是通过CSS实现的,今天我们要说的是给这个“tooltip提示框”整体加一个 ...
- 【C++】const
1. 默认状态下,const对象仅在文件内有效,即在不同文件中出现同名const变量的时候,其实相当于这些同名const是不同的东西. 如果想要在文件中共享const变量,可以在const变量不管是声 ...
- HTML DOM基础知识
HTML DOM基础知识 一.什么是DOM? 1.HTML DOM 定义了访问和操作HTML文档的标准方法. 2.HTML DOM 把 HTML 文档呈现为带有元素.属性和文本的树结构(节点树). 3 ...
- centos7 yum安装mysql5.7并在root密码忘记的情况下重设密码
CentOS7的yum源中默认好像是没有mysql的.为了解决这个问题,我们要先下载mysql的repo源. 1. 下载mysql的repo源 1 $ wget http://repo.mysql ...
- Access项目文件的版本控制
简单记录一下使用MS Access SVN(以下简称AccessSVN)的步骤吧. AccessSVN在http://accesssvn.codeplex.com/,该产品的目的是:Access SV ...
- 如何在断开ssh连接后仍然保持服务器正常运行程序
问题描述:当SSH远程连接到服务器上,然后运行一个Python程序(bpr.py),然后把终端开闭(切断SSH连接)之后,发现该程序执行中断. 解决方法:使用nohup命令让程序在关闭窗口(切换SSH ...
- 亚马逊如何变成 SOA(面向服务的架构)?
阮一峰 日期: 2016年9月10日 上一篇文章,我摘录了<程序员的呐喊>.这本书有趣的内容太多,今天再摘录一段. 1. 亚马逊公司不仅是世界最大的网络书店,还是世界最大的云服务商.它是怎 ...
- EXCEL导入导出自己整理的一些方法
//导入Excel代码 protected DataTable ExcelHelper(string filePaht) { string sFilePath2003 = Server.MapPath ...
- Android APK反编译详解(附图)
转载自http://blog.csdn.net/sunboy_2050/article/details/6727581 这段时间在学Android应用开发,在想既然是用Java开发的应该很好反编译从而 ...
- 使用jquery的imagecropper插件做用户头像上传 兼容移动端
在移动端开发的过程中,或许会遇到对图片裁剪的问题.当然遇到问题问题,不管你想什么方法都是要进行解决的,哪怕是丑点,难看点,都得去解决掉. 图片裁剪的jquery插件有很多,我也测试过很多,不过大多数都 ...