又是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. ansible服务及剧本编写

    第1章 ansible软件概念说明 python语言是运维人员必会的语言,而ansible是一个基于Python开发的自动化运维工具 (saltstack).其功能实现基于SSH远程连接服务:ansi ...

  2. 常用的 JS 排序算法整理

    关于排序算法的问题可以在网上搜到一大堆,但是纯 JS 版比较零散,之前面试的时候特意整理了一遍,附带排序效率比较. //1.冒泡排序 var bubbleSort = function(arr) { ...

  3. SQL企业级面试题

    链接:90root MySQL企业面试题 1. 开发有一堆数据插入,如何防止插入的中文数据产生乱码? 2. 如何批量更改数据库表的引擎,如:myisam改为innodb 3. 如何批量更改数据库字符集 ...

  4. JS中数组的方法

    1. join() Array.join() 是 String.split() 的逆向操作 var arr = [1, 2, 3] arr.join()// "1,2,3" arr ...

  5. 英雄联盟LOL用什么语言写的?

    是用openGL开发的 开发语言是c/c++ 客户端是一个.net的web界面

  6. 修改placeholder的样式

    input::-webkit-input-placeholder, textarea::-webkit-input-placeholder { color: #666; } input:-moz-pl ...

  7. ajax调用数据案例,二级联动

    题目:请针对移动端web浏览器制作一个结账数据信息展示页面 要求: 1. 页面样式除不使用表格呈现外,可自由选择其他呈现方式 2. 需符合移动端操作习惯 3. 可根据服务区.门店查询结账信息 4. 可 ...

  8. volatile关键字是如何起作用的?

    关键字volatile是Java虚拟机提供的最轻量级的同步机制,但是在平时的项目里面,遇到需要多线程的时候更多地使用的是synchronized关键字来进行同步.个人而言,更多的原因是对volatil ...

  9. ant安装和验证

    1.下载apache-ant-1.9.6 2.D:\software\apache-ant-1.9.6 3.配置环境变量 在系统变量path的最后面添加D:\software\apache-ant-1 ...

  10. SpringMVC RequestMapping注解

    1.@RequestMapping 除了修饰方法,还可以修饰类 2.类定义处:提供初步的请求映射信息.相对于WEB应用的根目录  方法处:提供进一步细分映射信息  相对于类定义处的URL.若类定义处未 ...