题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2243

题意:给出m个串,问有多少不大于n的串至少包含m个串中的一个?

思路:首先求出不包含m个串的长度不大于n的串的个数,也就是对应矩阵A:S=A^1+A^2+……A^n。然后就是26+26^2+26^3+……+26^n-S。

const int mod=100000;
const int N=105;struct node
{int next[26],fail,flag;void init(){clr(next,0);fail=-1;flag=0;}
};node a[N];
int e,n,m;
char s[N];void insert(char s[])
{int i,k,p=0;for(i=0;s[i];i++){k=s[i]-'a';if(a[p].next[k]==0){a[e].init();a[p].next[k]=e++;}p=a[p].next[k];}a[p].flag=1;
}queue<int> Q;void build()
{Q.push(0);int i,j,k,p,q;while(!Q.empty()){k=Q.front();Q.pop();for(i=0;i<26;i++){if(a[k].next[i]){p=a[k].next[i];q=a[k].fail;while(q!=-1&&!a[q].next[i]) q=a[q].fail;if(q==-1) a[p].fail=0;else{a[p].fail=a[q].next[i];a[p].flag|=a[a[p].fail].flag;}Q.push(p);}else{q=a[k].fail;while(q!=-1&&!a[q].next[i]) q=a[q].fail;if(q==-1) a[k].next[i]=0;else a[k].next[i]=a[q].next[i];}}}
}u64 b[N][N],d[N][N];void mul(u64 a[][N],u64 b[][N])
{int i,j,k;u64 c[N][N]={0};FOR0(k,e) FOR0(i,e) FOR0(j,e){c[i][j]+=a[i][k]*b[k][j];}FOR0(i,e) FOR0(j,e) b[i][j]=c[i][j];
}u64 getPow(u64 a,u64 b)
{u64 ans=1;while(b){if(b&1) ans=ans*a;a=a*a;b>>=1;}return ans;
}void copyMatrix(u64 A[][N],u64 B[][N])
{int i,j;FOR0(i,e) FOR0(j,e) B[i][j]=A[i][j];
}u64 getSum(u64 a,u64 n)
{if(n==0) return 1;if(n&1) return getSum(a,n>>1)*(1+getPow(a,n/2+1));else return getPow(a,n)+getSum(a,n/2-1)*(1+getPow(a,n/2));
}void initMatrix(u64 A[][N])
{int i,j;FOR0(i,e) FOR0(j,e) A[i][j]=0;FOR0(i,e) A[i][i]=1;
}void getPOW(u64 A[][N],u64 B[][N],int n)
{initMatrix(B);u64 C[N][N];copyMatrix(A,C);while(n){if(n&1) mul(C,B);mul(C,C);n>>=1;}
}void addMatrix(u64 A[][N],u64 B[][N])
{int i,j;FOR0(i,e) FOR0(j,e) B[i][j]+=A[i][j];
}void print(u64 A[][N])
{int i,j;FOR0(i,e){FOR0(j,e) printf("%I64u ",A[i][j]);puts("");}puts("");
}u64 C[N][N],D[N][N],E[N][N];void getSum(u64 A[][N],u64 B[][N],int n)
{if(n==0){initMatrix(B);return;}if(n&1){getSum(A,B,n/2);initMatrix(C);getPOW(A,D,n/2+1);addMatrix(C,D);mul(D,B);}else{getSum(A,B,n/2-1);getPOW(A,C,n);initMatrix(D);getPOW(A,E,n/2);addMatrix(D,E);mul(E,B);addMatrix(C,B);}
}int main()
{while(scanf("%d%d",&m,&n)!=-1){a[0].init();e=1;int i,j,k;FOR0(i,m) RD(s),insert(s);build();clr(b,0);FOR0(i,e) if(!a[i].flag) FOR0(j,26){k=a[i].next[j];if(!a[k].flag) b[i][k]++;}u64 sum=getSum(26,n),x=((u64)1)<<63;;getSum(b,d,n);FOR0(i,e) if(!a[i].flag) sum-=d[0][i];printf("%I64u\n",sum);}return 0;
}

  

HDU 2243 考研路茫茫——单词情结(自动机)相关推荐

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

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

  2. HDU 2243 考研路茫茫——单词情结 求长度小于等于L的通路总数的方法

    http://acm.hdu.edu.cn/showproblem.php?pid=2243 这是一题AC自动机 + 矩阵快速幂的题目, 首先知道总答案应该是26^1 + 26^2 + 26^3 .. ...

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

    背单词,始终是复习英语的重要环节.在荒废了3年大学生涯后,Lele也终于要开始背单词了. 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法.比如"ab",放在单词前一般 ...

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

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

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

    题目链接 思路 假设让求长度为LLL且不包含词根的个数,对所有的词根建acacac自动机,然后用矩阵MMM表示可转移状态,最后最快速幂即可. 如何求长度不超过LLL且不包含LLL且不包含词根的个数,可 ...

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

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

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

    [HDU No. 2243]单词情结 考研路茫茫--单词情结 杭电OJ 题目地址 [题意] 单词和词根仅由小写字母组成.给定N个词根,求长度不超过L 且至少包含一个词根的单词可能有多少个? 若有两个词 ...

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

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

  9. [hdu2243]考研路茫茫——单词情结(AC自动机+矩阵快速幂)

    题意:长度不超过L,只由小写字母组成的,至少包含一个词根的单词,一共可能有多少个. 解题关键:利用补集转化的思想,先求一个词根也不包含的单词个数,然后用总的减去即可.长度不超过L需要用矩阵维数增加一倍 ...

最新文章

  1. 电脑识别指令和代码的原理
  2. Python基础,面向对象
  3. GAN不只会造假:捕获数据中额外显著特征,提高表征学习可解释性,效果超越InfoGAN | IJCAI 2020...
  4. 朴素贝叶斯分类器(Navie Bayesian Classifier)中的几个要点(一)
  5. 在线编辑_水墨-在线 Markdown 编辑器
  6. python t t_Python ttable包_程序模块 - PyPI - Python中文网
  7. linux下mknod命令介绍
  8. 线程同步之 生产者消费者模型详解
  9. 有哪些问题应该得到解决?
  10. maven deploy到nexus报错:Return code is: 401, ReasonPhrase:Unauthorized
  11. win10装系统--笔记
  12. 钉钉、微信产品大PK,基因已经决定了结果
  13. Windows 7 64位下使用ADB驱动
  14. [职业规划]电子通信专业大学之路
  15. QPushButton中clicked消息参数一直返回false问题解决方法
  16. interlace video encode PAFF 和MBAFF
  17. Python暴力破解密码
  18. 代码的坏味道之二十一 :Refused Bequest(被拒绝的遗贈)
  19. Java jsp导出Excel打开报格式或扩展名错误
  20. python爬虫app步骤_Python爬虫抓取手机APP的传输数据,python爬虫抓取app

热门文章

  1. eeglab中文教程系列(14)-Working with ICA Components
  2. [CES 2018] 与联想、小蚁合作,谷歌发布VR180系列VR相机
  3. iOS应用开发入门(3)——点击button控制textview
  4. 华为自研编程语言「仓颉」火上热搜,已正式开启内测,成员辟谣:不是中文编程...
  5. 这家民办研究院太年轻,竟敢跟世界级选手“叫板”
  6. 不是所有图像都值16x16个词,清华与华为提出动态ViT
  7. 小米副总裁崔宝秋:智能手机是今天AI技术最大的平台,AIoT又让AI无处不在 | MEET 2021...
  8. 双非高校浙工大,一年2项研究上Nature,校友纷纷打Call:欠一个211名头
  9. 马斯克一作!Neuralink脑机接口细节公布,特殊材料防大脑损伤,专用芯片助技术落地...
  10. DOM渲染的详细过程 1