[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< ...
随机推荐
- Linux简介,虚拟机安装,网络设置,桌面和vim安装
Linux简介: linux代表系统内核.Linux系统指基于Linux内核的操作系统,由内核和程序结合组成.比较流行的发行版本由RedHat Linux.Fedora.Centos.Debian.U ...
- Xamarin截取/删除emoji表情bug解决方案
大家都知道,一个英文=1字节,一个汉字2字节,而一个emoji表情=4个字节,在有这三种混用的时候,比如app聊天界面,那么删除和截取便成了很头痛的事情. 问题描述 截取导致乱码,如下图: 解决方案 ...
- <tangmuchw>之新手vue项目小记--新建.vue文件,运行项目,出现error:This dependency was not found...
错误码: This dependency was not found: * !!vue-style-loader!css-loader?{"minimize":false,&quo ...
- js计算字数
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- OpenStack运维(三):OpenStack存储节点和配置管理
1.对象存储节点维护 1.1 重启存储节点 如果一个存储节点需要重启,直接重启即可. 1.2 关闭存储节点 如果一个存储节点需要关闭很长一段时间,可以考虑将该节点从存储环中移除. swift-ring ...
- Nginx (三) 使用Keepalived搭建高可用服务
Nginx可以实现高并发反向代理,实现负载均衡,但是有个问题就是Nginx是单点的.如果Nginx故障,则整个服务将会处于不可用状态.所以我们就需要想办法让nginx高可用,即使一个Nginx宕机,还 ...
- linux下后台运行MATLAB
原帖:http://sypeterli1.blog.163.com/blog/static/2283740492013101745824207/ 后台运行matlab脚本文件的方法:nohup ...
- oracle12c_安装3——部署
数据库安装后需要根据实际情况修改相关参数. 1.生成pfile以防万一. SQL> create pfile from spfile; 2.修改内存参数 只要设置MEMORY_MAX_TARGE ...
- Python 项目实践三(Web应用程序)第四篇
接着上节继续学习,本章将建立用户账户 Web应用程序的核心是让任何用户都能够注册账户并能够使用它,不管用户身处何方.在本章中,你将创建一些表单,让用户能够添加主题和条目,以及编辑既有的条目.你还将学习 ...
- 利用伪元素:after清除浮动
一.代码 html代码 <div class="clearfix"></div> css样式 .clearfix{ zoom:1;/*这个属性是为了兼容IE ...