题目

给n个字母,构成长度为m的串,总共有n^m种。给p个字符串,问n^m种字符串中不包含(不是子串)这p个字符串的个数。

将p个不能包含的字符串建立AC自动机,每个结点用val值来标记以当前节点为后缀的字符串是否包含非法字符串(p个字符串中的任何一个)。

状态转移方程:f(i, j)  += f(i-1, k)

f(i, j)表示长度为i的字符串,结尾为字符j,方程j和k的关系可以从自动机中失配关系直接获得(j是k的后继结点)。

总之感觉是好东西,快存下来

大数模版:

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. using namespace std;
  5.  
  6. struct BigInteger{
  7. int A[];
  8. enum{MOD = };
  9. BigInteger(){memset(A, , sizeof(A)); A[]=;}
  10. void set(int x){memset(A, , sizeof(A)); A[]=; A[]=x;}
  11. void print(){
  12. printf("%d", A[A[]]);
  13. for (int i=A[]-; i>; i--){
  14. if (A[i]==){printf(""); continue;}
  15. for (int k=; k*A[i]<MOD; k*=) printf("");
  16. printf("%d", A[i]);
  17. }
  18. printf("\n");
  19. }
  20. int& operator [] (int p) {return A[p];}
  21. const int& operator [] (int p) const {return A[p];}
  22. BigInteger operator + (const BigInteger& B){
  23. BigInteger C;
  24. C[]=max(A[], B[]);
  25. for (int i=; i<=C[]; i++)
  26. C[i]+=A[i]+B[i], C[i+]+=C[i]/MOD, C[i]%=MOD;
  27. if (C[C[]+] > ) C[]++;
  28. return C;
  29. }
  30. BigInteger operator * (const BigInteger& B){
  31. BigInteger C;
  32. C[]=A[]+B[];
  33. for (int i=; i<=A[]; i++)
  34. for (int j=; j<=B[]; j++){
  35. C[i+j-]+=A[i]*B[j], C[i+j]+=C[i+j-]/MOD, C[i+j-]%=MOD;
  36. }
  37. if (C[C[]] == ) C[]--;
  38. return C;
  39. }
  40. };
  41. int main() {
  42. BigInteger a, b;
  43. a.set(); b.set();
  44. (a+b).print();
  45.  
  46. return ;
  47. }

本题答案(内含AC自动机模版):

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <vector>
  6. #include <queue>
  7. using namespace std;
  8. typedef unsigned char uchar;
  9.  
  10. struct AC_Automata {
  11. #define N 102
  12. int ch[N][], val[N], last[N], f[N], sz;
  13. void clear() { sz = ; memset(ch[], , sizeof(ch[])); }
  14.  
  15. int hash[], M;
  16. void set_hash(int n, uchar s[]) {
  17. M = n; for (int i=; i<n; i++) hash[s[i]] = i;
  18. }
  19. void insert(uchar s[], int v) {
  20. int u = ;
  21. for (int i=; s[i]; i++) {
  22. int c = hash[s[i]];
  23. if (!ch[u][c]) {
  24. memset(ch[sz], , sizeof(ch[sz]));
  25. val[sz] = ;
  26. ch[u][c] = sz++;
  27. }
  28. u = ch[u][c];
  29. }
  30. val[u] = v; //标记当前串为非法的
  31. }
  32. void build() {
  33. queue<int> q;
  34. f[] = ;
  35. for (int c=; c<M; c++) {
  36. int u = ch[][c];
  37. if (u) { f[u] = last[u] = ; q.push(u); }
  38. }
  39. while (!q.empty()) {
  40. int r = q.front(); q.pop();
  41. for (int c=; c<M; c++) {
  42. int u = ch[r][c];
  43. val[r] = val[r] || val[f[r]]; //判断当前结点是否有非法后缀
  44. if (!u) {
  45. ch[r][c] = ch[f[r]][c];
  46. continue;
  47. }
  48. q.push(u);
  49. f[u] = ch[f[r]][c];
  50. last[u] = val[f[u]] ? f[u] : last[f[u]];
  51. }
  52. }
  53. }
  54. } ac;
  55. struct BigInteger{
  56. int A[];
  57. enum{MOD = };
  58. BigInteger(){memset(A, , sizeof(A)); A[]=;}
  59. void set(int x){memset(A, , sizeof(A)); A[]=; A[]=x;}
  60. void print(){
  61. printf("%d", A[A[]]);
  62. for (int i=A[]-; i>; i--){
  63. if (A[i]==){printf(""); continue;}
  64. for (int k=; k*A[i]<MOD; k*=) printf("");
  65. printf("%d", A[i]);
  66. }
  67. printf("\n");
  68. }
  69. int& operator [] (int p) {return A[p];}
  70. const int& operator [] (int p) const {return A[p];}
  71. BigInteger operator + (const BigInteger& B){
  72. BigInteger C;
  73. C[]=max(A[], B[]);
  74. for (int i=; i<=C[]; i++)
  75. C[i]+=A[i]+B[i], C[i+]+=C[i]/MOD, C[i]%=MOD;
  76. if (C[C[]+] > ) C[]++;
  77. return C;
  78. }
  79. BigInteger operator * (const BigInteger& B){
  80. BigInteger C;
  81. C[]=A[]+B[];
  82. for (int i=; i<=A[]; i++)
  83. for (int j=; j<=B[]; j++){
  84. C[i+j-]+=A[i]*B[j], C[i+j]+=C[i+j-]/MOD, C[i+j-]%=MOD;
  85. }
  86. if (C[C[]] == ) C[]--;
  87. return C;
  88. }
  89. };
  90. int n, m, p;
  91. uchar s[];
  92.  
  93. int main() {
  94.  
  95. while (scanf("%d %d %d ", &n, &m, &p) == ) {
  96. ac.clear();
  97. cin >> s; ac.set_hash(n, s);
  98. while (p--) {
  99. cin >> s; ac.insert(s, );
  100. }
  101. ac.build();
  102.  
  103. BigInteger f[][];
  104. f[][].set();
  105.  
  106. for (int i=; i<=m; i++)
  107. for (int j=; j<ac.sz; j++)
  108. for (int k=; k<n; k++) {
  109. int u = ac.ch[j][k];
  110. if (!ac.val[u]) f[i][u] = f[i][u] + f[i-][j];
  111. }
  112. BigInteger ans;
  113. for (int i=; i<ac.sz; i++)
  114. if (!ac.val[i]) ans = ans + f[m][i];
  115. ans.print();
  116. }
  117. return ;
  118. }

poj 1625 (AC自动机好模版,大数好模版)的更多相关文章

  1. Censored! POJ - 1625 AC自动机+大数DP

    题意: 给出一n种字符的字典,有p个禁用的单词, 问能组成多少个不同的长度为m的合法字符串.(m<=50) 题解: 是不是个我们之前做的题目非常非常像,题意都一样. 直接将上次写的AC自动机+矩 ...

  2. Censored! - POJ 1625(ac自动机+简单dp+高精度运算)

    题目大意:首先给一个字符集合,这个集合有N个字符,然后需要一个长度为M的句子,但是据子里面不能包含的串有P个,每个串里面的字符都是有字符集和里面的字符构成的,现在想知道最多能构造多少个不重复的句子. ...

  3. POJ 3691 (AC自动机+状态压缩DP)

    题目链接:  http://poj.org/problem?id=3691 题目大意:给定N个致病DNA片段以及一个最终DNA片段.问最终DNA片段最少修改多少个字符,使得不包含任一致病DNA. 解题 ...

  4. POJ 2778 (AC自动机+矩阵乘法)

    POJ 2778 DNA Sequence Problem : 给m个只含有(A,G,C,T)的模式串(m <= 10, len <=10), 询问所有长度为n的只含有(A,G,C,T)的 ...

  5. POJ 2896 AC自动机 or 暴力

    DESCRIPTION :大意是说.给你n个代表病毒的字符串.m个表示网站的字符串.让你计算有多少个网站被病毒感染了.被那些病毒感染了. 刚开始就想暴力.然而,忽略了条件:每个网站最多有三个病毒.于是 ...

  6. DNA Sequence POJ - 2778 AC自动机 && 矩阵快速幂

    It's well known that DNA Sequence is a sequence only contains A, C, T and G, and it's very useful to ...

  7. poj 4052(ac自动机)

    题意:自己百度吧!! 分析:就是通过它的fail指针来找出它的子串就行了,这题其实不难的.这好像还是金华邀请赛的题哦! 代码实现: #include<cstdio> #include< ...

  8. poj 2778 AC自动机+矩阵快速幂

    题目链接:https://vjudge.net/problem/POJ-2778 题意:输入n和m表示n个病毒,和一个长为m的字符串,里面只可以有'A','C','G','T' 这四个字符,现在问这个 ...

  9. DNA Sequence POJ - 2778 AC 自动机 矩阵乘法

    定义重载运算的时候一定要将矩阵初始化,因为这个调了一上午...... Code: #include<cstdio> #include<algorithm> #include&l ...

随机推荐

  1. golang thrift 总结一下网络上的一些坑

    我们以hello world来大概分析一下golang中的thrift包,并且扒一扒网络上有关thrift的一些坑 查看源码,服务器定义如下:(详见simple_server.go文件) type T ...

  2. BZOJ-3670 动物园 KMP+奇怪的东西

    YveH爷再刷KMP,DCrusher看他刷KMP,跟着两个人一块刷KMP... 3670: [Noi2014]动物园 Time Limit: 10 Sec Memory Limit: 512 MB ...

  3. NYOJ298点的转换(矩阵十大问题之一)

    点的变换 时间限制:2000 ms  |  内存限制:65535 KB 难度:5   描述 平面上有不超过10000个点,坐标都是已知的,现在可能对所有的点做以下几种操作: 平移一定距离(M),相对X ...

  4. Support Vector Machines for classification

    Support Vector Machines for classification To whet your appetite for support vector machines, here’s ...

  5. hdu 1241 Oil Deposits(水一发,自我的DFS)

    解题思路: 1. 遍历扫描二维数组,遇到‘@’,结果ans++; 2. 将当前 i,j 位置置为‘*’,将当前‘@’的 i,j 传人到DFS函数中,开始遍历八个方向的字符 如果碰到 '@' 则先将当前 ...

  6. 升级centos6.5系统的gcc为4.8.5的简易步骤

    Centos6.5_64位升级gcc为4.8.2的简易步骤 一.安装依赖包 yum install texinfo-tex flex zip mpfr-devel libgcc.i686 glibc- ...

  7. MySQL中varchar类型在5.0.3后的变化

    1.mysql varchar类型变化:mysql 5.0.3 之前: 0--255字节 varchar(20)中的20表示字节数,如果存放urf8编码的话只能放6个汉字. MySQL 5.0.3 之 ...

  8. Linq 中 表连接查询

    public void Test(){ var query = from a in A join b in B on A.Id equals B.Id into c from d in c.Defau ...

  9. Hibernate3的DetachedCriteria支持

    Hibernate3支持DetachedCriteria,这是一个非常有意义的特性!我们知道,在常规的Web编程中,有大量的动态条件查询,即用户在网页上面自由选择某些条件,程序根据用户的选择条件,动态 ...

  10. Cannot find class [org.apache.commons.dbcp.BasicDataSource]

    错误:Cannot find class [org.apache.commons.dbcp.BasicDataSource] 原因:缺少commons-dbcp.jar