hdu 2243 考研路茫茫——单词情结 ac自动机+矩阵快速幂
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2243
题意:给定N(1<= N < 6)个长度不超过5的词根,问长度不超过L(L <231)的单词中至少含有一个词根的单词个数;结果mod 264.
基础:poj 2778DNA 序列求的是给定长度不含模式串的合法串的个数;串长度相当,都到了int上界了;
1.mod 264直接使用unsigned long long自然溢出即可;说的有些含蓄。。并且也容易想到是直接使用内置类型,要不然高精度的mod 2^64要跪;
2.本题是poj 2778的升级版,里面求的是范围内,并不是特定的长度,并且还是含有至少一个;那么直接从反面求解,即用总个数-不含有词根的个数;
3.对矩阵的操作,实现对连续离散指数求和; 对矩阵增加一列,全部为1,增加的行除了右下角为1外,其他均为0;
$\begin{pmatrix}
A\Rightarrow \begin{pmatrix}
A & 1\\
0 & 1
\end{pmatrix}
\end{pmatrix}$
$ans = \sum \limits_{i=0}^{\rm size}mat\left [ 0 \right ]\left [ i \right ]$
同理求解:$\sum \limits_{i=0}^{\rm size}26^i$只需建立二维矩阵
\begin{vmatrix}
26 & 1\\
0 & 1
\end{vmatrix}之后直接矩阵快速幂即可;
// 15ms 1632k
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<time.h>
#include<stack>
#include<set>
#include<map>
#include<queue>
using namespace std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define MS0(a) memset(a,0,sizeof(a))
#define MS1(a) memset(a,-1,sizeof(a))
#define MSi(a) memset(a,0x3f,sizeof(a))
#define inf 0x3f3f3f3f
#define lson l, m, rt << 1
#define rson m+1, r, rt << 1|1
#define sqr(a) (a)*(a)
typedef pair<int,int> PII;
#define A first
#define B second
#define MK make_pair
typedef __int64 ll;
typedef unsigned long long ull;
template<typename T>
void read1(T &m)
{
T x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
m = x*f;
}
template<typename T>
void read2(T &a,T &b){read1(a);read1(b);}
template<typename T>
void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
template<typename T>
void out(T a)
{
if(a>) out(a/);
putchar(a%+'');
}
int T,kase = ,i,j,k,n,m,top;
#define mod 100000
struct Matrix{
ull d[][];
int sz;//不能也弄成ull,否则int => ull会出错
Matrix(int r){MS0(d); sz = r;}
void init(){
for(int i = ;i < sz;i++)
d[i][i] = ;
}
Matrix operator*(const Matrix& a)const{
Matrix ans(a.sz);
for(int i = ;i < sz;i++)
for(int j = ;j < sz;j++){
for(int k = ;k < sz;k++)
ans.d[i][j] += d[i][k]*a.d[k][j];
}
return ans;
}
void debug(){
rep0(i,,sz){
rep0(j,,sz) cout<<d[i][j]<<" ";
cout<<endl;
}
}
};
Matrix Pow(Matrix a,ll m)
{
Matrix ans(a.sz);
ans.init();
while(m){
if(m&) ans = ans*a;
a = a*a;
m >>= ;
}
return ans;
}
const int sigma_size = ;
const int maxn = ;
struct Aho_Corasick{
int ch[maxn][sigma_size];
int val[maxn],f[maxn],last[maxn],cnt[maxn];
int sz;
map<string,int> ms;
Aho_Corasick(){}
void init(){sz = ;val[] = ; MS0(ch[]);MS0(cnt);ms.clear();}
int idx(char c){return c-'a';}
void Insert(char *s,int v){
int u = ,n = strlen(s);
for(int i = ;i < n;i++){
int c = idx(s[i]);
if(!ch[u][c]){
MS0(ch[sz]);
val[sz] = ;
ch[u][c] = sz++;
}
u = ch[u][c];
}
val[u] = v;
}
void getFail(){
queue<int> q;
f[] = ;
for(int c = ;c < sigma_size;c++){ //初始化队列
int u = ch[][c];
if(u) { f[u] = ; q.push(u); last[u] = ;}
}
while(!q.empty()){
int r = q.front();q.pop();
for(int c = ;c < sigma_size;c++){
int u = ch[r][c];
if(!u) {ch[r][c] = ch[f[r]][c]; continue;}//实现压缩
q.push(u);
int v = f[r];
while(v && !ch[v][c]) v = f[v];
f[u] = ch[v][c];
last[u] = val[f[u]]?f[u]:last[f[u]];
}
}
}
Matrix Find(){
Matrix ans(sz+);
for(int i = ;i < sz;i++){
if(val[i] || last[i]) continue;
for(int j = ;j < sigma_size;j++){
int v = ch[i][j];
if(val[v] || last[v]) continue;
ans.d[i][v]++;
}
ans.d[i][sz] = ;//添加一列保存前面的sigma和;
}
ans.d[sz][sz] = ;//右下角
return ans;
}
}ac;
char p[];
int main()
{
ull n,L;
//freopen("data.txt","r",stdin);
while(scanf("%I64d%I64d",&n,&L) == ) {
ac.init();
rep1(i,,n){
scanf("%s",p);
ac.Insert(p,i);
}
ac.getFail();
Matrix ans = ac.Find();
ans = Pow(ans,L);
ull cnt = ;
rep0(i,,ans.sz) cnt += ans.d[][i];
Matrix a();//求总和
a.d[][] = ,a.d[][] = a.d[][] = ;
a = Pow(a,L);
printf("%I64u\n",a.d[][]+a.d[][]-cnt);
}
return ;
}
hdu 2243 考研路茫茫——单词情结 ac自动机+矩阵快速幂的更多相关文章
- HDU 2243 考研路茫茫——单词情结(AC自动机+DP+快速幂)
题目链接 错的上头了... 这题是DNA的加强版,26^1 +26^2... - A^1-A^2... 先去学了矩阵的等比数列求和,学的是第二种方法,扩大矩阵的方法.剩下就是各种模板,各种套. #in ...
- hdu 2243 考研路茫茫——单词情结 AC自动机 矩阵幂次求和
题目链接 题意 给定\(N\)个词根,每个长度不超过\(5\). 问长度不超过\(L(L\lt 2^{31})\),只由小写字母组成的,至少包含一个词根的单词,一共可能有多少个? 思路 状态(AC自动 ...
- [hdu2243]考研路茫茫——单词情结(AC自动机+矩阵快速幂)
题意:长度不超过L,只由小写字母组成的,至少包含一个词根的单词,一共可能有多少个. 解题关键:利用补集转化的思想,先求一个词根也不包含的单词个数,然后用总的减去即可.长度不超过L需要用矩阵维数增加一倍 ...
- hdu 2243 考研路茫茫——单词情结(AC自动+矩阵)
考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu_2243_考研路茫茫——单词情结(AC自动机+矩阵)
题目链接:hdu_2243_考研路茫茫——单词情结 题意: 让你求包含这些模式串并且长度不小于L的单词种类 题解: 这题是poj2788的升级版,没做过的强烈建议先做那题. 我们用poj2778的方法 ...
- 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 考研路茫茫——单词情结 求长度小于等于L的通路总数的方法
http://acm.hdu.edu.cn/showproblem.php?pid=2243 这是一题AC自动机 + 矩阵快速幂的题目, 首先知道总答案应该是26^1 + 26^2 + 26^3 .. ...
- HDU2243 考研路茫茫——单词情结 ——AC自动机、矩阵优化
题目链接:https://vjudge.net/problem/HDU-2243 考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others) Memor ...
随机推荐
- eclipse+ADT 进行android应用签名详解
http://jojol-zhou.iteye.com/blog/719428 1.Eclipse工程中右键工程,弹出选项中选择 android工具-生成签名应用包: 2.选择需要打包的android ...
- iOS-制作Framework
步骤 打开Xcode,创建新工程.手下留情,请先看图! 在TARGETS下选中工程,在Build Settings下更改几个参数. 更改参数 在Architectures下增加armv7s,并选中.将 ...
- OC中-方法到底是如何使用的?
方法:方法是Objective-C独有的一种结构,只能在Objective-C中声明.定义和使用,C语言不能声明.定义和使用. 1.类方法以+号开头,对象方法以-号开头+ (void) init; ...
- 禁用 Browser Link,在浏览器调试的时候回出现大量的get,post数据。
VS2013新增的Browser Link功能虽然“强大”,但默认是开启的,很烦人!
- c++中运算符重载,+,-,--,+=,-=,*,/,*=,/=,
#include<iostream> #include<stdlib.h> using namespace std; class Complex { public: Compl ...
- 倒影(box-reflect)
box-reflect: 语法:box-reflect:none | <direction> <offset>? <mask-box-image>?因为不是w3c标 ...
- SonarQube(5.0.1) 环境的安装配置
SonarQube 安装步骤 确定 JDK 和 MySQL 已经成功安装. 下载 SonarQube 及工具 SonarQube Runner,下载地址:http://www.sonarqube.or ...
- Java多线程并发
http://wangjianwei866.blog.163.com/blog/static/9295823201231665319314/ 基于以上网文,调整了一下格式,修改了一些标点和拼写错误. ...
- 组装和拆分JSON
1.组装JSON rs["msg"] = "success"; rs[" ...
- Agile.Net 组件式开发平台 - 开发环境部署
环境准备: Windows 7 (32/64) Windows Server 2008 (32/64) Microsoft SQL Server 2008 R2 (32/64) Microsoft V ...