Description


Solution

这道题目的60分非常的简单,直接用ac自动机直接搞一搞就好了。
但是后面的40分怎么做?
我们发现后面的40分全部都是基本单词长度不会大于2,所以我们可以考虑一下怎么矩阵乘法。
假设我们的转移的矩阵有两个部分:[i-1,i]
那么我们要转移到[i,i+1]
当单词长度为1的时候,可以从i转移到i+1,i-1转移到i
当单词长度为2的识货,可以从i-1转移到i+1
所以我们可以这样构造矩阵:
[空][i-1->i+1]
[i->i][i->i+1]
那么i->i就是对角线为1,i->i+1就是ac自动机转移式单词长度为1的部分,i-1->i+1就是ac自动机转移式单词长度为2的部分

Code

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int maxn=207,mxx=1e4+7,mo=1e9+7;
char s[maxn];
int i,j,k,l,n,m,num,q,da;
int len[maxn],t[mxx][26],p[mxx],g[maxn];
int d[mxx],root,x,y,z,a[maxn][maxn];
ll ans;
struct node{ll a[maxn][maxn];
}b,c,e,o,u;
ll f[maxn/2][mxx];
bool bz;
void bfs(){int head=0,tail=1,i,j;while(head<tail){x=d[++head];fo(i,0,25){y=t[x][i];if(!y)continue;z=p[x];g[y]+=g[x];while(z&&!t[z][i])z=p[z];if(z!=x)p[y]=t[z][i];g[y]+=g[p[y]];d[++tail]=y;}}
}
void cheng(node x,node y){int i,j,k;memset(u.a,0,sizeof(u.a));fo(i,0,da){fo(j,0,da){fo(k,0,da)u.a[i][j]=(u.a[i][j]+x.a[i][k]*y.a[k][j]%mo)%mo;}}o=u;
}
void qsm(node x,ll y){int i,j;fo(i,0,da)e.a[i][i]=1;for(;y;y/=2){if(y&1)cheng(e,x),e=o;cheng(x,x);x=o;}
}
int main(){freopen("sorcery.in","r",stdin);freopen("sorcery.out","w",stdout);scanf("%d%d%d",&n,&m,&l);fo(i,1,n){scanf("%s",s+1);len[i]=strlen(s+1);fo(j,1,len[i])a[i][j]=s[j]-'a';}fo(i,1,m){scanf("%s",s+1);x=0;fo(j,1,strlen(s+1)){if(!t[x][s[j]-'a'])t[x][s[j]-'a']=++num;x=t[x][s[j]-'a'];}g[x]++;}bfs();if(l<=100){f[0][0]=1;fo(i,0,l-1){fo(j,0,num){if(!f[i][j])continue;fo(k,1,n){if(i+len[k]>l)continue;x=j;bz=1;fo(q,1,len[k]){while(x&&!t[x][a[k][q]])x=p[x];y=t[x][a[k][q]];if(g[y]){bz=0;break;}x=y;}if(bz)f[i+len[k]][x]=(f[i][j]+f[i+len[k]][x])%mo;}}}fo(j,0,num)ans=(ans+f[l][j])%mo;printf("%d\n",ans);}else{b.a[0][num+1]=1;fo(j,0,num){fo(k,1,n){x=j;bz=1;fo(q,1,len[k]){while(x&&!t[x][a[k][q]])x=p[x];y=t[x][a[k][q]];if(g[y]){bz=0;break;}x=y;}if(bz){if(len[k]==1)c.a[j+num+1][x+num+1]++;else c.a[j][x+num+1]++;}}}fo(j,0,num)c.a[j+num+1][j]=1;da=num*2+1;qsm(c,l);c=e;cheng(b,c);fo(j,num+1,2*num+1)ans=(ans+o.a[0][j])%mo;printf("%lld\n",ans);}
}

【GDOI2017第三轮模拟day2】魔法咒语(AC自动机,矩阵乘法)相关推荐

  1. 【bzoj1444】[Jsoi2009]有趣的游戏 AC自动机+矩阵乘法

    题目描述 输入 注意 是0<=P 输出 样例输入 样例输出 题解 AC自动机+矩阵乘法 先将所有字符串放到AC自动机中,求出Trie图. 然后构建邻接矩阵:如果x不是某个字符串的末位置,则x连向 ...

  2. 【jzoj5078】【GDOI2017第三轮模拟day2】【魔法咒语】【ac自动机】【矩阵快速幂】

    题目大意 解题思路 对非法串构ac自动机,对于l较小的情况,设f[i][j]表示长度为i,在ac自动机上j点的方案数,直接dp即可. 对于加入串len<=2的情况,对于每个j拆成两个点矩阵快速幂 ...

  3. 【JZOJ5078】【GDOI2017第三轮模拟day2】魔法咒语

    Description Data Constraint Solution 考场上打出了70分,由于没看到100分的长度不超过2,所以与100分失之交臂. 70分显然是打颗AC自动机,在trie树做dp ...

  4. [BZOJ1444]有趣的游戏(AC自动机+矩阵乘法)

    n个等长字符串,机器会随机输出一个字符串(每个字母出现的概率为p[i]),问每个字符串第一个出现的概率是多少. 显然建出AC自动机,套路地f[i][j]表示i时刻位于节点j的概率. 构建转移矩阵,当i ...

  5. BZOJ 1009 GT考试 (AC自动机 + 矩阵乘法加速dp)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1009 题意: 准考证号为\(n\)位数\(X_1X_2....X_n(0<=X_ ...

  6. hdu 3962(AC自动机+矩阵优化dp)

    转载标记处:http://blog.csdn.net/woshi250hua/article/details/7599472 题目大意:给定m个DNA病毒序列,求碱基构成的长度为n且含有两个以上DNA ...

  7. HDU - 2243 考研路茫茫——单词情结(AC自动机+矩阵快速幂)

    题目链接:点击查看 题目大意:给出 n 个词根,现在要求出长度不大于 len 的单词中,有多少单词包含至少一个词根 题目分析:如果我们反过来想,也就是求出来总的单词数,然后减去不包含词根的单词数,剩下 ...

  8. L. Poor God Water(ACM-ICPC 2018 焦作赛区网络预赛,ac自动机+矩阵快速幂 或 BM线性递推)

    描述 God Water likes to eat meat, fish and chocolate very much, but unfortunately, the doctor tells hi ...

  9. 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂

    [题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...

最新文章

  1. React事件处理函数传参问题
  2. RedHat7/CentOS7 压缩解压命令汇总
  3. 11--Rails数据交互3
  4. 光流 | OpenCV3实现LK Optical Flow(代码类)
  5. 隐式调用 Intent 大全
  6. android studio多屏幕,为多个屏幕实现多个布局但在android studio 2.1中无法工作
  7. 输入流IS和输出流OS学习总结
  8. Dubbo学习总结(9)——Apache Dubbo Roadmap 2019
  9. 如何格式化电脑_如何将c盘格式化,垃圾文件太多,不知道怎么办
  10. 简说 Python 生态系统的 14 年演变
  11. FFMPEG类库打开流媒体的方法(需要传参数的时候)
  12. Windows UWP开发系列 – 控件默认样式
  13. UCBCS188 AI学习笔记(2)informed search (启发函数搜索)
  14. Host is not allowed to connect to this MySQL server错误的解决办法
  15. verilog 按键消抖
  16. typedef struct LNode *p和typedef struct LNode笔记
  17. POI删除Excel中数据有效性
  18. SqlSugar.SqlSugarException: English Message : Connection open error . 给定关键字不在字典中
  19. vue 路由懒加载,使用 import 无法处理
  20. OpenCV3实现图像拼接融合

热门文章

  1. AI深度学习入门与实战15 TensorBoard:实验统计分析助手
  2. 基于振动信号的旋转设备故障诊断实践
  3. 英语薄冰语法书pdf_薄冰上的电子邮件
  4. 网格搜索、随机搜索和贝叶斯调参总结与实践
  5. php工程师绩效考核表_php绩效考核.doc
  6. VUE中 用AntV G6 + element 实现关系图展示
  7. win10系统双屏幕屏蔽副屏幕的底部任务栏
  8. Scratch(五十四):教师节快乐
  9. 从0开始学习kaldi决策树绑定+三音素
  10. 设置安全或非安全部署