链接

跟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+二分矩阵)的更多相关文章

  1. [hdu2243]考研路茫茫——单词情结(AC自动机+矩阵快速幂)

    题意:长度不超过L,只由小写字母组成的,至少包含一个词根的单词,一共可能有多少个. 解题关键:利用补集转化的思想,先求一个词根也不包含的单词个数,然后用总的减去即可.长度不超过L需要用矩阵维数增加一倍 ...

  2. hdu 2243 考研路茫茫——单词情结(AC自动+矩阵)

    考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. HDU2243 考研路茫茫——单词情结 ——AC自动机、矩阵优化

    题目链接:https://vjudge.net/problem/HDU-2243 考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others)    Memor ...

  4. hdu_2243_考研路茫茫——单词情结(AC自动机+矩阵)

    题目链接:hdu_2243_考研路茫茫——单词情结 题意: 让你求包含这些模式串并且长度不小于L的单词种类 题解: 这题是poj2788的升级版,没做过的强烈建议先做那题. 我们用poj2778的方法 ...

  5. hdu 2243 考研路茫茫——单词情结 AC自动机 矩阵幂次求和

    题目链接 题意 给定\(N\)个词根,每个长度不超过\(5\). 问长度不超过\(L(L\lt 2^{31})\),只由小写字母组成的,至少包含一个词根的单词,一共可能有多少个? 思路 状态(AC自动 ...

  6. HDU-2243 考研路茫茫——单词情结(AC自动机)

    题目大意:给n个单词,长度不超过L的单词有多少个包含n个单词中的至少一个单词. 题目分析:用长度不超过L的单词书目减去长度在L之内所有不包含任何一个单词的书目. 代码如下: # include< ...

  7. hdu 2243 考研路茫茫——单词情结 ac自动机+矩阵快速幂

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2243 题意:给定N(1<= N < 6)个长度不超过5的词根,问长度不超过L(L <23 ...

  8. hdu2243 考研路茫茫——单词情结【AC自动机】【矩阵快速幂】

    考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  9. HDU2243 考研路茫茫——单词情结(AC自动机+矩阵快速幂)

    与POJ2778一样.这题是求长度不超过n且包含至少一个词根的单词总数. 长度不超过n的单词总数记为Sn,长度不超过n不包含词根的单词总数记为Tn. 答案就是,Sn-Tn. Sn=26+262+263 ...

随机推荐

  1. 使用safe-rm替代rm

    safe-rm主页: https://launchpad.net/safe-rm 一.下载safe-rm 二.解压文件,拷贝safe-rm到/usr/local/bin/目录下 三.建立软连接: #l ...

  2. Android You need to use a Theme.AppCompat theme (or descendant) with this activity.

    错误描述为:java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with ...

  3. Android中Animation 详细解读

    Animation从总体来说可以分为两类: 1.Tweened Animations:该类提供了旋转,移动,伸展,淡入淡出等效果 Tweened Animations也有四种类型: 1.     Al ...

  4. Oracle在dos命令下导出导入

    DOS下运行的命令,也可以加参数在SQL/PLUS环境下运行简单例子实现 单表备份(前提库的结构是一样的)导出:开始钮->运行->输入CMD->进入DOS界面EXP 用户名/密码@连 ...

  5. luaprofiler探索

    什么是luaprofiler? http://luaprofiler.luaforge.net/manual.html LuaProfiler is a time profiler designed ...

  6. nginx限制访问速度

    转自:http://siwei.me/blog/posts/nginx-ip 参考:http://tengine.taobao.org/document_cn/http_limit_req_cn.ht ...

  7. Xamarin 编程之打电话

    参考:http://www.cnblogs.com/yaozhenfa/ Main.axml <?xml version="1.0" encoding="utf-8 ...

  8. 夺命雷公狗-----React---4--props变量的传递

    提示:props的值是不可以改变的... <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  9. Magento 自定义一个搜索功能

    最近工作中有一个需求是需要做一个搜索的功能,但是因为需要定制一些外观,所以就不用传统的方法来继承基类GRID.实现这个需求的核心其实就是下面这个方法. $this->getLayout()-&g ...

  10. image -- pmp