POJ - 1625 Censored!
希望自己能成为日更博主
题目连接: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!相关推荐
- [POJ 1625] Censored! (AC自动机+DP+高精度)
链接 POJ 1625 题意 给出P个模式串,问长度为M且不含有P中任何一个为子串的字符串有多少种. 给出了大小为N的一个字符集,属于ASCII但不一定为英文字母. 最终答案不进行取模,所以可能非常大 ...
- POJ 1625 Censored ( Trie图 DP 高精度 )
题意 : 给出 n 个单词组成的字符集 以及 p 个非法串,问你用字符集里面的单词构造长度为 m 的单词的方案数有多少种? 分析 : 与 POJ 2778 非常相似的一道题目,如果没有做过就尝试去了解 ...
- POJ 1625 Censored! (AC自己主动机 + 高精度 + DP)
题目链接:Censored! 解析:AC自己主动机 + 高精度 + 简单DP. 字符有可能会超过128.用map映射一下就可以. 中间的数太大.得上高精度. 用矩阵高速幂会超时,简单的DP就能解决时间 ...
- POJ 1625 Censored! (AC自动机 + 高精度 + DP)
题目链接:Censored! 解析:AC自动机 + 高精度 + 简单DP. 字符有可能会超过128,用map映射一下即可. 中间的数太大,得上高精度. 用矩阵快速幂会超时,简单的DP就能解决时间的问题 ...
- POJ 1625 Censored!
给定p个模式串,求长度为m<=50的串中不包含任何模式串的串的种类数,字符仅由给出的n个字符构成,用mp数组标记下.然后和之前的几道类似,利用end和next数组得到转态转移数组,然后由于题目数 ...
- POJ - 1625 Censored!(AC自动机+dp+高精度运算)
题目链接:点击查看 题目大意:给出一个含有 n 个不同字符的字符集,接着规定所有单词的长度为 m ,再给出 k 个病毒串,问有多少个字符串中不含有病毒串 题目分析:这个题目和之前做过的DNA的那个题有 ...
- POJ 1625 Censored!(自动机DP+高精度)
题意:给出包含n个字符的字符集,以下所提字符串均由该字符集中的字符构成.给出p个长度不超过10的字符串,求长为m且不包含上述p个字符串的字符串有多少个. 数据范围:1<=n,m<=50,0 ...
- POJ 1625 Censored!
辣鸡OI毁我青春 Description The alphabet of Freeland consists of exactly N letters. Each sentence of Freela ...
- POJ 1625 Censored!(AC自动机-指针版+DP+大数)题解
题目:给你n个字母,p个模式串,要你写一个长度为m的串,要求这个串不能包含模式串,问你这样的串最多能写几个 思路:dp+AC自动机应该能看出来,万万没想到这题还要加大数...orz 状态转移方程dp[ ...
最新文章
- java 反射 protected_Java反射机制设置对象里的private、protected属性值
- 乐行科技获1.08亿元A轮融资,并推出艾特好车
- 【一步教学,一步到位】mysql高可用架构
- Android应用开发SharedPreferences存储数据的使用方法
- Usb设备驱动3:root hub守护进程2
- 微信小程序 详解 小程序支付
- 《SAS编程与数据挖掘商业案例》学习笔记之一
- 蔡徐坤团队获得”微博年度最佳团体“!vivo X23幻彩版却实力抢眼
- 解决android混淆编译出现Proguard returned with error code 1和文件名、目录名或卷标语法不正确错误...
- BZOJ 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛( 二分答案 )
- youtube-dl 安装和用法
- 从零开始用人工智能预测股票(二、数据加工)
- openssh和openssl下载网址
- 01蓝桥杯特训课程第一次总结
- 中国移动通信互联网短信网关接口协议及相关下载
- php if多条件,php – 多个IF语句条件
- 1055 集体照 Python实现
- 地平线机器人上海待遇_目前室内机器人、SLAM现状如何?行业内顶尖技术在哪些高校或企业 ?...
- Odoo产品分析 (三) -- 人力资源板块(6) -- 工资表(2)
- 嵌入式C设计模式---职责链设计模式
热门文章
- 4K工业级高清4进1出DP自动USB KVM多电脑切换器(MT-PK401)
- 如何理解反步法设计控制器?
- 鲸探发布点评:7月7日发售陈孟昕系列绘画数字藏品
- Codeforces Round #727 (Div. 2)2021.6.20
- 摊牌了!我要手写一个“Spring Boot”
- 迅雷9边下边播绑定第三方播放器
- R语言分组画条形图——qplot
- login.keyring的问题
- 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法
- 抱明月而长终;知不可乎骤得