[POJ2243]考研路茫茫——单词情结
又是AC自动机上用矩乘优化DP= =
其实和上一题基本一样。。。补集转化思想。。
只是要多弄一个小矩阵求(26^1+26^2+....+26^L),并且也要求f的总和(因为是长度<=L)
直接调上一题的伪板子了= =
喜闻乐见CE了好几发。。。就因为iostream里有next这个名字的函数>_<(那我上一题怎么没CE啊摔
#include<cstdio>
#include<cstring>
#define ll long long
#define ull unsigned long long
using namespace std;
int dl[],fail[],num[];
int ch[][],tot,next[][];
ull mp[][];
ull c[][],tmp[][],ans;
int i,j,k,n,m,l,r,cnt;
bool gg[];
char s[]; ll tm[],t[]; inline void trie(int n){
int i,p=;
for(i=;i<n;i++){
s[i]-='a';
if(!ch[p][s[i]])ch[p][s[i]]=++tot,p=tot;
else p=ch[p][s[i]];
}
gg[p]=;//printf("gg: %d\n",p);
}
inline void getfail(){
int l=,r=,i,j,now,p;dl[]=;
while(l<r){
now=dl[++l];//printf(" %d fail:%d gg:%d\n",now,fail[now],gg[now]);
for(i=;i<;i++)if(ch[now][i]){
j=ch[now][i];//printf(" %d-->%d\n",now,j);
for(p=fail[now];p&&!ch[p][i];p=fail[p]);
if(!now)fail[j]=;else fail[j]=ch[p][i];
dl[++r]=j;gg[j]|=gg[fail[j]];
}
}
}
inline void getnext(){
l=,r=;int i,now,p;dl[]=;
while(l<r){
now=dl[++l];//printf(" %d\n",now);
for(i=;i<;i++){
if(ch[now][i]){
if(gg[ch[now][i]])next[now][i]=-;
else next[now][i]=ch[now][i],dl[++r]=ch[now][i];
}
else{
for(p=fail[now];p&&!ch[p][i];p=fail[p]);
next[now][i]=gg[ch[p][i]]?-:ch[p][i];
}
// printf("%d %d next:%d\n",now,i,next[now][i]);
}
}
}
inline void upd(){
cnt=;int i,j;
for(i=;i<=r;i++)
num[dl[i]]=++cnt;
for(i=;i<=r;i++){
j=dl[i];
for(k=;k<;k++)if(next[j][k]!=-)
mp[num[next[j][k]]][num[j]]++;
} // for(i=1;i<=r;puts(""),i++)
// for(j=1;j<=r;j++)printf(" %lld",mp[i][j]);
} inline void multoc(){
register int i,j,k;
for(i=;i<=cnt;i++)
for(j=;j<=cnt;j++)
for(tmp[i][j]=,k=;k<=cnt;k++)tmp[i][j]+=mp[i][k]*c[k][j];
for(i=;i<=cnt;i++)memcpy(c[i],tmp[i],(cnt+)<<);
}
inline void multomp(){
register int i,j,k;
for(i=;i<=cnt;i++)
for(j=;j<=cnt;j++)
for(tmp[i][j]=,k=;k<=cnt;k++)tmp[i][j]+=mp[i][k]*mp[k][j];
for(i=;i<=cnt;i++)memcpy(mp[i],tmp[i],(cnt+)<<);
} int main(){
while(scanf("%d%d",&n,&m)!=EOF){
for(i=;i<=n;i++)scanf("%s",s),trie(strlen(s));
getfail(),getnext(),upd();
cnt++;
for(i=;i<=cnt;i++)mp[cnt][i]=;
cnt++,mp[cnt][cnt]=,cnt++,mp[cnt][cnt-]=mp[cnt][cnt]=; // for(i=1;i<=cnt;puts(""),i++)for(j=1;j<=cnt;j++)printf(" %llu",mp[i][j]); for(i=;i<=cnt;i++)c[i][i]=; /* tm[1]=1;
for(i=1;i<=m;i++){
for(j=1;j<=cnt;j++)
for(k=1,t[j]=0;k<=cnt;k++)t[j]=(t[j]+mp[j][k]*tm[k])%modd;
memcpy(tm,t,sizeof(t));
}*/ while(m){
if(m&)
multoc();
m>>=;if(m)multomp();
// for(i=1;i<=cnt;puts(""),i++)for(j=1;j<=cnt;j++)printf(" %llu",c[i][j]);
} // for(i=1;i<=cnt;puts(""),i++)for(j=1;j<=cnt;j++)printf(" %llu",c[i][j]);
//for(i=1,ans=0;i<=cnt;i++)ans=(ans+c[i][1])%modd;
ull ans=c[cnt][cnt-]*;
for(i=;i<=cnt-;i++)ans-=c[i][];
printf("%I64u\n",ans+); memset(mp,,sizeof(mp)),memset(c,,sizeof(c)),
memset(ch,,(tot+)**),memset(next,,(tot+)**),memset(fail,,(tot+)<<),memset(gg,,tot+),tot=;
}
// for(i=1,ans=0;i<=cnt;i++)ans=(ans+tm[i])%modd;
// printf("%lld\n",ans);
return ;
}
[POJ2243]考研路茫茫——单词情结的更多相关文章
- 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 ...
- hdu2243 考研路茫茫——单词情结【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 ...
- HDU2243 考研路茫茫——单词情结 ——AC自动机、矩阵优化
题目链接:https://vjudge.net/problem/HDU-2243 考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others) Memor ...
- HDU 2243 考研路茫茫——单词情结
考研路茫茫——单词情结 Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID ...
- hud2243 考研路茫茫——单词情结
考研路茫茫--单词情结 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...
- HDU-2243 考研路茫茫——单词情结(AC自动机)
题目大意:给n个单词,长度不超过L的单词有多少个包含n个单词中的至少一个单词. 题目分析:用长度不超过L的单词书目减去长度在L之内所有不包含任何一个单词的书目. 代码如下: # include< ...
随机推荐
- ansible服务及剧本编写
第1章 ansible软件概念说明 python语言是运维人员必会的语言,而ansible是一个基于Python开发的自动化运维工具 (saltstack).其功能实现基于SSH远程连接服务:ansi ...
- 常用的 JS 排序算法整理
关于排序算法的问题可以在网上搜到一大堆,但是纯 JS 版比较零散,之前面试的时候特意整理了一遍,附带排序效率比较. //1.冒泡排序 var bubbleSort = function(arr) { ...
- SQL企业级面试题
链接:90root MySQL企业面试题 1. 开发有一堆数据插入,如何防止插入的中文数据产生乱码? 2. 如何批量更改数据库表的引擎,如:myisam改为innodb 3. 如何批量更改数据库字符集 ...
- JS中数组的方法
1. join() Array.join() 是 String.split() 的逆向操作 var arr = [1, 2, 3] arr.join()// "1,2,3" arr ...
- 英雄联盟LOL用什么语言写的?
是用openGL开发的 开发语言是c/c++ 客户端是一个.net的web界面
- 修改placeholder的样式
input::-webkit-input-placeholder, textarea::-webkit-input-placeholder { color: #666; } input:-moz-pl ...
- ajax调用数据案例,二级联动
题目:请针对移动端web浏览器制作一个结账数据信息展示页面 要求: 1. 页面样式除不使用表格呈现外,可自由选择其他呈现方式 2. 需符合移动端操作习惯 3. 可根据服务区.门店查询结账信息 4. 可 ...
- volatile关键字是如何起作用的?
关键字volatile是Java虚拟机提供的最轻量级的同步机制,但是在平时的项目里面,遇到需要多线程的时候更多地使用的是synchronized关键字来进行同步.个人而言,更多的原因是对volatil ...
- ant安装和验证
1.下载apache-ant-1.9.6 2.D:\software\apache-ant-1.9.6 3.配置环境变量 在系统变量path的最后面添加D:\software\apache-ant-1 ...
- SpringMVC RequestMapping注解
1.@RequestMapping 除了修饰方法,还可以修饰类 2.类定义处:提供初步的请求映射信息.相对于WEB应用的根目录 方法处:提供进一步细分映射信息 相对于类定义处的URL.若类定义处未 ...