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 ...
随机推荐
- 对list进行切片
取一个list的部分元素是非常常见的操作.比如,一个list如下: >>> L = ['Adam', 'Lisa', 'Bart', 'Paul'] 取前3个元素,应该怎么做? 笨办 ...
- css before&after 特殊用途
平常仅仅需要将这两个伪元素用于添加一些自定义字符 p:before {content:"hello"} 但我们还可以使用before&after这两个伪类做一些特殊效果 ...
- 深入理解asp.net里的HttpModule机制
刚工作的时候看<asp.net深入解析>,第一次知道HttpModule和HttpHandler.当时对我而言,它们不过就是两个新名词而已,仅仅知道工作原理但是理解的不深刻.随着经验的累积 ...
- 深入Python(4):深拷贝和浅拷贝
一.前奏:熟悉Python内存管理 在Python中,变量在第一次赋值时自动声明,在创建---也就是赋值的时候,解释器会根据语法和右侧的操作数来决定新对象的类型. 引用计数器:一个内部跟踪变量 引用计 ...
- Given an array where elements are sorted in ascending order, convert it to a height balanced BST.
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode ri ...
- Synchronized 个人深解
1.synchronized方法相当于synchronized(this) Synchronized 方法是锁的当前对象,同一个对象的2个synchronized方法被2个线程调用会发生 ...
- 快速掌握Flyway
什么是Flyway? Flyway is an open-source database migration tool. It strongly favors simplicity and conve ...
- VC6在win7环境下无法添加以及打开现有文件的解决办法
在VC6.0中使用键盘快捷键或者是文件菜单打开现有文件以及添加文件出现编辑器停止响应,弹出内容为Microsoft(R) Developer Studio已停止工作 Windows正在检查解决该 ...
- [HTML5]移动开发不同手机弹出数字键盘问题
这里还是先那么先交代一下遇到的问题.其实无论是tel还是number都不是完美的:type="tel"优点是iOS和Android的键盘表现都差不多缺点是那些字母好多余,虽然我没有 ...
- Consolidated Seed Table Upgrade Patch(Patch 17204589)
$ adop phase=apply patches= hotpatch=yes abandon=no Enter the APPS password: Enter the SYSTEM passwo ...