希望自己能成为日更博主

题目连接:http://poj.org/problem?id=1625 

题目大意:给你n个字母,再给你p个字符串,问有多少个长度为m的只由给出的n个字母构成的字符串,且字符串不能包括给出的p个字符串;

题解:因为这个题不用取模,所以得使用高精度,参考了博客:https://www.cnblogs.com/shangyu/p/3730815.html;这个题和HDU 2243很像,只要把他的矩阵快速幂换成高精度就可以了。dp[i+1][next] = dp[i+1][next]+dp[i][j] , dp[i][j] 表示长度为 i 在第j个结点的方案数,next为当前j点所能走到的下一个合法的结点。求不含啥啥字符串的个数时,建立ac自动机时都会有end[now]|=end[fail[now]] ,表示如果当前结点fail指向的结点被标记了,那么当前节点也要被标记。

  1 #include<iostream>2 #include<stdio.h>3 #include<algorithm>4 #include<queue>5 #include<string.h>6 using namespace std;7 8 const int base=1e4;9 const int DIG=4;10 const int maxn = 11100;11 const int MX = 1110;12 int n,m,p;13 int id[2200];14 15 struct tire{16     int nxt[maxn][2200],fail[maxn],end[maxn],tot,root,vis[maxn];17     int newNode(){18         for(int i=0;i<n;i++) nxt[tot][i] = -1;19         end[tot++] = 0;20         return tot-1;21     }22     void Init(){23         tot = 0;24         root = newNode();25     }26     void Insert(char *buf){27         int len = strlen(buf),i,u = root;28         for(i=0;i<len;i++){29             int x = id[buf[i]];30             if(nxt[u][x]==-1) nxt[u][x] = newNode();31             u = nxt[u][x];32         }33         end[u] = 1;34     }35     void build(){36         queue <int> q;37         fail[root] = root;38         for(int i=0;i<n;i++){39             if(nxt[root][i]==-1) nxt[root][i] = root;40             else{41                 fail[nxt[root][i]] = root;42                 q.push(nxt[root][i]);43             }44         }45         while(!q.empty()){46             int now = q.front();47             q.pop();48             for(int i=0;i<n;i++){49                 if(nxt[now][i]==-1) nxt[now][i] = nxt[fail[now]][i];50                 else{51                     fail[nxt[now][i]] = nxt[fail[now]][i];52                     q.push(nxt[now][i]);53                 }54             }55             end[now]|=end[fail[now]];56         }57     }58 }ac;59 60 struct bignum61 {62     int a[110],len;63     bignum()64     {65         memset(a,0,sizeof(a));66         len=1;67     }68     bignum(int v)69     {70         memset(a,0,sizeof(a));71         len=0;72         do{73             a[len++]=v%base;74             v/=base;75         }while(v);76     }77     bignum(const char s[])78     {79         memset(a,0,sizeof(a));80         int k = strlen(s);81         len = k/DIG;82         if(k%DIG) len++;83         int cnt = 0;84         for(int i = k-1;  i >= 0 ; i-=DIG){85             int t = 0;86             int kk = i-DIG+1;87             if(kk<0) kk =0;88             for(int j = kk ; j <= i ; j++)89              t = t*10+s[j]-'0';90             a[cnt++] = t;91          }92     }93     bignum operator + (const bignum &b) const94     {95         bignum res;96         res.len=max(len,b.len);97         int i;98         for(i=0;i<res.len;i++)99             res.a[i]=0;
100         for(i=0;i<res.len;i++){
101             res.a[i]+=((i<len)?a[i]:0)+((i<b.len)?b.a[i]:0);
102             res.a[i+1]+=res.a[i]/base;
103             res.a[i]=res.a[i]%base;
104         }
105         if(res.a[res.len]>0) res.len++;
106         return res;
107     }
108     void output()
109     {
110         printf("%d",a[len-1]);
111         for(int i=len-2;i>=0;i--)
112             printf("%04d",a[i]);
113         printf("\n");
114     }
115 }dp[110][110];
116
117 void solve()
118 {
119     for(int i=1;i<=m;i++)
120         for(int j=0;j<=ac.tot;j++)
121             dp[i][j]=bignum(0);
122     dp[0][0]=bignum(1);
123     for(int i=0;i<m;i++){
124         for(int j=0;j<ac.tot;j++){
125             for(int k=0;k<n;k++){
126                 if(ac.end[ac.nxt[j][k]]) continue;
127                 dp[i+1][ac.nxt[j][k]]= dp[i+1][ac.nxt[j][k]]+dp[i][j];
128             }
129         }
130     }
131     bignum ans=bignum(0);
132     for(int j=0;j<ac.tot;j++)
133         ans=ans+dp[m][j];
134     ans.output();
135 }
136
137 char s1[MX];
138
139 int main()
140 {
141     scanf("%d%d%d",&n,&m,&p);
142     ac.Init();
143     scanf("%s",s1);
144     for(int i=0;i<n;i++){
145         id[s1[i]]=i;
146     }
147     for(int i=0;i<p;i++)
148         scanf("%s",s1),ac.Insert(s1);
149     ac.build();
150     solve();
151     return 0;
152 }

POJ - 1625 Censored!相关推荐

  1. [POJ 1625] Censored! (AC自动机+DP+高精度)

    链接 POJ 1625 题意 给出P个模式串,问长度为M且不含有P中任何一个为子串的字符串有多少种. 给出了大小为N的一个字符集,属于ASCII但不一定为英文字母. 最终答案不进行取模,所以可能非常大 ...

  2. POJ 1625 Censored ( Trie图 DP 高精度 )

    题意 : 给出 n 个单词组成的字符集 以及 p 个非法串,问你用字符集里面的单词构造长度为 m 的单词的方案数有多少种? 分析 : 与 POJ 2778 非常相似的一道题目,如果没有做过就尝试去了解 ...

  3. POJ 1625 Censored! (AC自己主动机 + 高精度 + DP)

    题目链接:Censored! 解析:AC自己主动机 + 高精度 + 简单DP. 字符有可能会超过128.用map映射一下就可以. 中间的数太大.得上高精度. 用矩阵高速幂会超时,简单的DP就能解决时间 ...

  4. POJ 1625 Censored! (AC自动机 + 高精度 + DP)

    题目链接:Censored! 解析:AC自动机 + 高精度 + 简单DP. 字符有可能会超过128,用map映射一下即可. 中间的数太大,得上高精度. 用矩阵快速幂会超时,简单的DP就能解决时间的问题 ...

  5. POJ 1625 Censored!

    给定p个模式串,求长度为m<=50的串中不包含任何模式串的串的种类数,字符仅由给出的n个字符构成,用mp数组标记下.然后和之前的几道类似,利用end和next数组得到转态转移数组,然后由于题目数 ...

  6. POJ - 1625 Censored!(AC自动机+dp+高精度运算)

    题目链接:点击查看 题目大意:给出一个含有 n 个不同字符的字符集,接着规定所有单词的长度为 m ,再给出 k 个病毒串,问有多少个字符串中不含有病毒串 题目分析:这个题目和之前做过的DNA的那个题有 ...

  7. POJ 1625 Censored!(自动机DP+高精度)

    题意:给出包含n个字符的字符集,以下所提字符串均由该字符集中的字符构成.给出p个长度不超过10的字符串,求长为m且不包含上述p个字符串的字符串有多少个. 数据范围:1<=n,m<=50,0 ...

  8. POJ 1625 Censored!

    辣鸡OI毁我青春 Description The alphabet of Freeland consists of exactly N letters. Each sentence of Freela ...

  9. POJ 1625 Censored!(AC自动机-指针版+DP+大数)题解

    题目:给你n个字母,p个模式串,要你写一个长度为m的串,要求这个串不能包含模式串,问你这样的串最多能写几个 思路:dp+AC自动机应该能看出来,万万没想到这题还要加大数...orz 状态转移方程dp[ ...

最新文章

  1. java 反射 protected_Java反射机制设置对象里的private、protected属性值
  2. 乐行科技获1.08亿元A轮融资,并推出艾特好车
  3. 【一步教学,一步到位】mysql高可用架构
  4. Android应用开发SharedPreferences存储数据的使用方法
  5. Usb设备驱动3:root hub守护进程2
  6. 微信小程序 详解 小程序支付
  7. 《SAS编程与数据挖掘商业案例》学习笔记之一
  8. 蔡徐坤团队获得”微博年度最佳团体“!vivo X23幻彩版却实力抢眼
  9. 解决android混淆编译出现Proguard returned with error code 1和文件名、目录名或卷标语法不正确错误...
  10. BZOJ 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛( 二分答案 )
  11. youtube-dl 安装和用法
  12. 从零开始用人工智能预测股票(二、数据加工)
  13. openssh和openssl下载网址
  14. 01蓝桥杯特训课程第一次总结
  15. 中国移动通信互联网短信网关接口协议及相关下载
  16. php if多条件,php – 多个IF语句条件
  17. 1055 集体照 Python实现
  18. 地平线机器人上海待遇_目前室内机器人、SLAM现状如何?行业内顶尖技术在哪些高校或企业 ?...
  19. Odoo产品分析 (三) -- 人力资源板块(6) -- 工资表(2)
  20. 嵌入式C设计模式---职责链设计模式

热门文章

  1. 4K工业级高清4进1出DP自动USB KVM多电脑切换器(MT-PK401)
  2. 如何理解反步法设计控制器?
  3. 鲸探发布点评:7月7日发售陈孟昕系列绘画数字藏品
  4. Codeforces Round #727 (Div. 2)2021.6.20
  5. 摊牌了!我要手写一个“Spring Boot”
  6. 迅雷9边下边播绑定第三方播放器
  7. R语言分组画条形图——qplot
  8. login.keyring的问题
  9. 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法
  10. 抱明月而长终;知不可乎骤得