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 ...
随机推荐
- 类似网易新闻 title栏 滚动时 文字放大&变色
http://files.cnblogs.com/files/n1ckyxu/ScrollTitleView.zip
- php5-fpm.sock failed (13: Permission denied) error
In order to fix the php5-fpm.sock failed error follow these instructions 1) Make sure your virtual h ...
- LeetCode Reconstruct Itinerary
原题链接在这里:https://leetcode.com/problems/reconstruct-itinerary/ 题目: Given a list of airline tickets rep ...
- Dedecms织梦系统修改文章描述字数长度的方法
1进入数据库修改表: dede_archives, 字段 description varchar(500): 2 进入织梦后台,找到 系统-->系统基本参数--> 其它选项自动摘要长度( ...
- RML-怎样的语句会被归纳为同一类型(Unique Batches)
我们知道使用RML工具分析跟踪数据(.TRC),其中的"Unique Batches",就是一个关于Batch级别的报表,Batch级别的报表针对的是存储过程或是一个TSQL Ba ...
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本━新增企业通(内部简易聊天工具)
RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本 新增企业通(内部简易聊天工具) RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用 ...
- AngularJS基础概要整理(下)
五.AngularJS Scope(作用域) Scope(作用域)是应用在HTML(视图)和JavaScript(控制器)之间的纽带. Scope是一个对象,有可用的方法和属性. Scope可应用在视 ...
- final关键字用法总结
在java中,可能使用到final关键字修饰的有数据.方法和类. 一.final 修饰数据 有final修饰的数据是用来告诉编译器一块数据是恒定不变的,有时数据恒定不变是很有用的,比如: 1.一个永不 ...
- 动态链接库(DLL)总结
以前的学习笔记,记录库的一点学习心得.主要是Windows下的静态库和动态链接库,动态链接库只写了关于非MFC的DLL,比较初级,适合和我一样的新手看看.有不对的地方请指出,有疏漏的地方请补充,如果您 ...
- Leetcode: K-th Smallest in Lexicographical Order
Given integers n and k, find the lexicographically k-th smallest integer in the range from 1 to n. N ...