考研路茫茫--单词情结 - HDU 2243(AC自动机+矩阵乘法)
分析:与poj的2778差不多的,求出来所有的情况然后减去不包含的就行了,这次使用了一下kuangbin的那种自动机写法,确实还不错,因为尤是在建立矩阵的时候更加方便。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#include<iostream>
using namespace std; const int MAXN = ;
const int MAXM = ;
const int mod = ; struct Matrix
{///定义矩阵
int size;
unsigned long long edge[MAXN][MAXN]; Matrix(int Len)
{
size = Len;
memset(edge, false, sizeof(edge));
}
Matrix operator *(const Matrix &Map) const
{
Matrix ans(size); for(int i=; i<size; i++)
for(int j=; j<size; j++)
for(int k=; k<size; k++)
{
ans.edge[i][j] += edge[i][k] * Map.edge[k][j];
} return ans;
}
}; struct Ac_Trie
{
int next[MAXN][MAXM];
int fail[MAXN], End[MAXN];
int Len, root; Ac_Trie()
{
memset(next, -, sizeof(next));
memset(End, false, sizeof(End));
Len = , root = ;
} void Insert(char s[])
{
int p = root; for(int i=; s[i]; i++)
{
int k = s[i] - 'a'; if(next[p][k] == -)
next[p][k] = Len++;
p = next[p][k];
} End[p] = true;
} void GetFail()
{
queue<int> Q;
int p = root; fail[p] = root; for(int i=; i<MAXM; i++)
{
if(next[p][i] == -)
next[p][i] = root;
else
{
fail[next[p][i]] = root;
Q.push(next[p][i]);
}
} while(Q.size())
{
p = Q.front();
Q.pop(); for(int i=; i<MAXM; i++)
{
if(next[p][i] == -)
next[p][i] = next[fail[p]][i];
else
{
fail[next[p][i]] = next[fail[p]][i];
Q.push(next[p][i]);
}
} End[p] |= End[fail[p]];
}
} Matrix GetMatrix()
{
Matrix ans(Len+); for(int i=; i<Len; i++)
for(int k=; k<MAXM; k++)
{
if(End[next[i][k]] == false)
ans.edge[i][next[i][k]] += ;
} for(int i=; i<=Len; i++)
ans.edge[i][Len] = ; return ans;
}
}; Matrix QuickPow(long long K, Matrix Map)
{
Matrix ans(Map.size); for(int i=; i<ans.size; i++)
ans.edge[i][i] = ; while(K)
{
if(K & )
ans = ans * Map;
Map = Map * Map; K /= ;
} return ans;
} int main()
{
long long N, L; while(scanf("%lld%lld", &N, &L) != EOF)
{
char s[MAXN];
Ac_Trie a; while(N--)
{
scanf("%s", s);
a.Insert(s);
} a.GetFail();
Matrix ans = a.GetMatrix(); unsigned long long sum1=, sum=; ans = QuickPow(L, ans); for(int i=; i<ans.size; i++)
sum1 += ans.edge[][i]; ans.size = ;
ans.edge[][] = ;
ans.edge[][] = ;
ans.edge[][] = ans.edge[][] = ; ans = QuickPow(L, ans); sum = ans.edge[][] + ans.edge[][]; cout << sum - sum1 <<endl;
} return ;
}
考研路茫茫--单词情结 - HDU 2243(AC自动机+矩阵乘法)的更多相关文章
- 考研路茫茫――单词情结 HDU - 2243(ac自动机 + 矩阵快速幂)
考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 考研路茫茫——单词情结 HDU - 2243 AC自动机 && 矩阵快速幂
背单词,始终是复习英语的重要环节.在荒废了3年大学生涯后,Lele也终于要开始背单词了. 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法.比如"ab",放在单词前一般 ...
- POJ - 2778 ~ HDU - 2243 AC自动机+矩阵快速幂
这两题属于AC自动机的第二种套路通过矩阵快速幂求方案数. 题意:给m个病毒字符串,问长度为n的DNA片段有多少种没有包含病毒串的. 根据AC自动机的tire图,我们可以获得一个可达矩阵. 关于这题的t ...
- hdu 2243 考研路茫茫——单词情结(AC自动+矩阵)
考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 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_考研路茫茫——单词情结(AC自动机+矩阵)
题目链接:hdu_2243_考研路茫茫——单词情结 题意: 让你求包含这些模式串并且长度不小于L的单词种类 题解: 这题是poj2788的升级版,没做过的强烈建议先做那题. 我们用poj2778的方法 ...
- hdu2243 考研路茫茫——单词情结【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 ...
随机推荐
- js中浮点型运算 注意点
先看张图: 这是一个JS浮点数运算Bug,导致我树状图,数据合计不正确,,,,,,两个小数相加,出来那么多位小数 (这是修该之后的) 网上找到以下解决方式: 方法一:有js自定义函数 <sc ...
- 【转】 UITableViewCell的标记、移动、删除、插入
原文: http://blog.csdn.net/duxinfeng2010/article/details/7725897 这篇文章是建立在 代码实现 UITableView与UITableView ...
- 【转】 ios开发之倒计时实现的两种方法
原文:http://blog.csdn.net/kylinbl/article/details/8972261 方法1:使用NSTimer来实现 主要使用的是NSTimer的scheduledTime ...
- iOS 百度地图监听地图状态
百度地图提供了地图状态的对象BMKMapStatus ///此类表示地图状态信息 @interface BMKMapStatus : NSObject { float _fLevel; // 缩放比例 ...
- javascript——操作符(~、&、|、^、<<、>>)
直接上代码吧! <script type="text/javascript"> //javascript操作符 //1.按位非~ var num1=25;// var ...
- ExtJs中动态加载机制研究(转)
觉得写的太好了,怕弄丢了,转一下:http://extjs.org.cn/node/659 昨天我们team对于extjs的动态加载机制做了些深入研究,这里先share下controller加载的结果 ...
- 《用chsh选择shell》-linux命令五分钟系列之十二
chsh命令用于修改你的登录shell. 1 我想知道我机器安装了哪些shell? 两种方法可以查看: 第一种: [rocrocket@wupengchong ~]$ chsh -l /bin/sh ...
- php之图片处理类缩略图加水印
用到两个image系统函数 imagecopymerge — 拷贝并合并图像的一部分 imagecopyresampled — 重采样拷贝部分图像并调整大小 /* 如何知道图片的大小和类型 无法确认调 ...
- JS动画理论
动画(Animation) 动画意味着随着时间而变化,尤其指视觉上的变化,包括位置.形态等的变化.运动基本上表现为物体随时间,发生位置上的变化:形态基本表现为大小.颜色.透明度.形状等随时间的变化. ...
- EasyUI篇の日期控件
页面代码: <input type="text" id='astartTime' class="easyui-datebox" style="w ...