又是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]考研路茫茫——单词情结的更多相关文章

  1. HDU 2243 考研路茫茫——单词情结(AC自动机+矩阵)

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

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

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

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

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

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

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

  5. 考研路茫茫――单词情结 HDU - 2243(ac自动机 + 矩阵快速幂)

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

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

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

  7. HDU 2243 考研路茫茫——单词情结

    考研路茫茫——单词情结 Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID ...

  8. hud2243 考研路茫茫——单词情结

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

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

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

随机推荐

  1. OC学习9——反射机制

    1.OC提供了3种编程方式与运行环境进行交互: 直接通过OC的源代码:这是最常见的方式,开发人员只是编写OC源代码,而运行环境负责在后台工作. 通过NSObject类中定义的方法进行动态编程:因为绝大 ...

  2. C C语言中关键词,以及知识点复习

    C语言学习 C语言练习知识点 auto        局部变量(自动储存) break       无条件退出程序最内层循环 case        switch语句中选择项 char         ...

  3. cell的复用机制

    以下全部都是转载自别人的博客:http://blog.sina.com.cn/s/blog_9c3c519b01016aqu.html 转自:http://www.2cto.com/kf/201207 ...

  4. Servlet过滤器简单探索

    过滤器的工作时机介于浏览器和Servlet请求处理之间,可以拦截浏览器对Servlet的请求,也可以改变Servlet对浏览器的响应. 其工作模式大概是这样的: 一.Filter的原理 在Servle ...

  5. BZOJ2001 HNOI2010 城市建设

    题目大意:动态最小生成树,可以离线,每次修改后回答,点数20000,边和修改都是50000. 顾昱洲是真的神:顾昱洲_浅谈一类分治算法 链接: https://pan.baidu.com/s/1c2l ...

  6. jsDOM编程-小球在盒子里来回撞击

    首先写一个小页面:页面需要一个div 这个div就是盒子,然后在div里在包含一个子div 这个子div就包含一张小球的图片 代码: <!doctype html> <html> ...

  7. tcpdump 命令详解

    TCPdump: dump  traffic on a network ,根据使用者的定义对网络上的数据包进行截获的一种包分析工具. TCPdump 可以讲网络中传送的数据包的 头信息完全截获下来提供 ...

  8. lesson - 8 课程笔记 tar / gzip /bzip2 / xz /

    作用:为linux的文件和目录创建档案,也可以在档案中改变文件,或者向档案中加入新的文件即用来压缩和解压文件.tar本身不具有压缩功能.他是调用压缩功能实现的  语法:tar[必要参数][选择参数][ ...

  9. 微信公众号开发——通过ffmpeg解决amr文件无法播放问题

    今天刚好碰到个需求,要在微信浏览器中实现录音,并在其他页面上播放.录音功能本身是JS SDK的功能,倒没啥问题,然而录音的文件保存下来是amr格式,而IOS的浏览器没法播放amr(据说微信浏览器的vi ...

  10. centos7 部署 ELK 日志系统

    =============================================== 2017/12/24_第3次修改                       ccb_warlock 更 ...